在C语言中,预处理程序语句可以使用\
字符扩展到多行。
#define SWAP(a, b) { \
a ^= b; \
b ^= a; \
a ^= b; \
}
这会将宏分散到几行,但有没有办法在行结束之前将宏关闭?即:我想在与宏相同的行上编写代码,但不希望它成为宏的一部分。例如,有没有办法使下列成为可能?
#include <stdio.h> (some character here to end macro) int main(int argc, const char **argv) { return 0; }
有没有办法合法地将预处理器语句和main
函数(或任何其他代码)放在同一行上?
答案 0 :(得分:8)
不,不是您在问题中特别提到的#include
声明。而且,虽然我没有专门检查(a),但所有预处理指令可能就是这种情况。
标准声明换行符是语法的一个组成部分(来自C11 6.10.2 Source file inclusion
):
形式的预处理指令
# include <h-char-sequence>
new-line
...
你可以在#include
指令之后发表评论,因为在第3阶段会发生单个空格的注释替换,而预处理指令在第4阶段处理(参见{{ 1}})。
但是这对于尝试将C11 5.1.1.2 Translation phases
函数定义之类的非注释放在同一行上没有帮助,这仍然是禁止的。
但我问你的问题是:为什么在地球上你想要这样做?只需输出两行即可完成。这并不像我们正在遭遇世界范围内的换行符短缺: - )
(a) Jonathan Leffler 已经检查,所以这个陈述几乎肯定是正确的。
来自ISO / IEC 9899:2011,§6.10预处理指令:
main()
常量表达式换行组 opt
# if
标识符换行组 opt
# ifdef
标识符换行组 opt
# ifndef
常量表达式换行组 opt
# elif
换行组 opt
# else
换行
# endif
pp-tokens new-line
# include
标识符替换列表换行
# define
标识符lparen标识符列表 opt )replacement-list new-line
# define
标识符lparen ...)replacement-list new-line
# define
标识符lparen标识符列表,...)替换列表换行
# define
标识符新行
# undef
pp-tokens new-line
# line
pp-tokens opt new-line
# error
pp-tokens opt new-line
# pragma
换行
答案 1 :(得分:2)
宏的第一行非白色字符必须为#
,并且宏会延伸到行尾(行连接\
个字符之后)。所以你不能“切断预处理器线”。
如果你想做一些疯狂的技巧答案,你可以在编译过程中更好地使用-D
或/D
(适用时),完全避免使用宏。
理智的编程要求永远不需要任何此类功能。