切断预处理器线

时间:2014-04-30 04:51:08

标签: c macros newline

在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函数(或任何其他代码)放在同一行上?

2 个答案:

答案 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(适用时),完全避免使用宏。

理智的编程要求永远不需要任何此类功能。