我希望有一种方法可以将#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
答案 0 :(得分:12)
我不喜欢这个想法,我只想提一下这种可能性。最好的是丹尼尔菲舍尔提到的方式。这个解决方案有点古怪,并不会在所有情况下都能正常工作,但是这里汇总了:
#define PATH(FILE) </path/to/FILE>
#include PATH(file.h)
仅列举一些明显的限制:
随意添加到此列表中。
修改
为了更好的可读性,我将以下面的示例风格发布Jonathans评论的解决方案:
#define STRINGIFY(x) #x
#define PATH(FILE) STRINGIFY(/path/to/FILE)
#include PATH(foo.h)
此版本可以缓解#include <>
版本的“位置问题”,因为它映射到#include ""
答案 1 :(得分:9)
这为我编译(我基于我记得Boost.PP的工作方式):
#define a() <vec\
tor>
#include a()
int main() {
std::vector<int> x;
}
只需将<vector>
更改为完整路径 - 我认为您不能以#include
中所需的方式连接字符串。
答案 2 :(得分:4)
使用另一个带有短名称的头文件来存储具有长名称的头文件。因此,所有超过80个字符的标题都不在您的格式良好的代码中。
//short_name.h
#include "really_really_long_include_name.h"
//code
#include "short_name.h"
答案 3 :(得分:4)
所有预处理指令都以换行符号终止。 include伪指令具有以下形式之一:
# include < h-char-sequence> new-line
# include " q-char-sequence" new-line
# include pp-tokens new-line
你的最后一个例子将导致相当于#include "foo" "bar"
被执行,因为虽然转义新行删除将在指令执行之前发生,但之后会发生字符串连接。这与include伪指令的最终有效形式相匹配。
但是,此表单会发生的情况是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)
答案 4 :(得分:3)
不,你不能,预处理器要求include文件名是一个预处理令牌。您需要修复正在使用的包含搜索路径,或者放宽每行80个字符的要求。