20

我希望有一种方法可以将 #include 指令拆分为两行,这样我的代码就可以符合每行 80 个字符的要求,尽管需要很长的包含路径。

除了扩展编译器的搜索路径之外,我该如何管理呢?有没有办法将我很长的路径字符串分成两行?

“#define”宏扩展显然发生在#include 扩展之后,所以这些不起作用:

#define BIGPATH "..."
#include BIGPATH ## "/foo.c"
#include "BIGPATH/foo.c"
#include BIGPATH"/foo.c"

我也试过

#include "foo" ##
         "bar"

#include "foo" \
         "bar"

无济于事。也许我想要的不可能?帮助我,stackoverflow kenobi,你是我唯一的希望。

答案:在下面建议的答案的基础上,这实际上对我有用:

#define STRINGIFY(x) #x
#define PATH(path) STRINGIFY(/my/very/long/path)
#include PATH(foo.h)
#undef PATH
#undef STRINGIFY
4

5 回答 5

12

我不喜欢这个想法,我只是想提一下这种可能性。最好的方法是按照 Daniel Fischer 提到的方式进行。这个解决方案有点古怪,在所有情况下都不起作用,但在这里编译:

#define PATH(FILE) </path/to/FILE>
#include PATH(file.h)

仅举一些明显的限制:

  • 这些包含的搜索路径不是“本地”
  • FILE 不得包含“,”(相当少见)
  • PATH 定义仍然可以超过 80 个字符

随意添加到此列表中。

编辑
只是为了更好的可读性,我将以我的示例风格在下面发布来自 Jonathans 评论的解决方案:

#define STRINGIFY(x) #x 
#define PATH(FILE) STRINGIFY(/path/to/FILE) 
#include PATH(foo.h)

这个版本缓解了版本的“局部性问题” #include <>,因为它映射到#include ""

于 2012-10-04T19:20:47.563 回答
9

这是为我编译的(我基于我回忆 Boost.PP 的工作方式):

#define a() <vec\
tor>

#include a()

int main() {
  std::vector<int> x;
}

只需更改<vector>为您的完整路径 - 我认为您不能以您需要的方式连接字符串 in #include.

于 2012-10-04T19:15:46.920 回答
4

使用另一个具有短名称的头文件来存储具有长名称的头文件。因此,所有超过 80 个字符的标题都不在您格式良好的代码中。

//short_name.h
#include "really_really_long_include_name.h"

//code
#include "short_name.h"
于 2012-10-04T19:19:12.277 回答
4

所有预处理指令都由换行符终止。include 指令是以下形式之一:

# include < h-char-sequence> new-line
# include " q-char-sequence" new-line
# include pp-tokens new-line

您的最后一个示例将导致等效于#include "foo" "bar"被执行,因为尽管转义的新行删除将在指令执行之前发生,但字符串连接会在之后发生。这与包含指令的最终有效形式相匹配。

但是,这种形式的结果是后面的任何宏名称include都将被替换。你的没有任何宏。如果生成的指令与正常的两种形式中的任何一种都不匹配,则行为未定义。

如果所有替换后产生的指令与前两种形式之一不匹配,则行为未定义

该标准对存在多个字符串文字的情况有一个特定的注释:

请注意,相邻的字符串文字不会连接成单个字符串文字(请参阅 2.2 中的翻译阶段);因此,导致两个字符串文字的扩展是无效指令。

这就是为什么该示例不起作用的原因。然而,这确实意味着我们可以依靠宏扩展来生成有效的文件名。例如:

#define LONG_PATH(file) <foo/bar/baz/file>
#include LONG_PATH(file.h)

或者:

#define STRINGIZE(x) #x
#define LONG_PATH(file) STRINGIZE(foo/bar/baz/file)
#include LONG_PATH(file.h)
于 2012-10-04T19:31:56.037 回答
3

不,你不能,预处理器要求包含文件名是单个预处理标记。您需要修复您正在使用的包含搜索路径,或者放宽每行 80 个字符的要求。

于 2012-10-04T19:11:53.617 回答