2014-04-30 53 views
1

在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

宏预处理器是相当机械的,没有办法将它短路。抱歉。也就是说,没有什么可以阻止您将代码放在与上述代码相同的行上。 –

+3

你为什么要这么做? C足够神秘而没有去追求单线......这可能是一个半可信的理由,但这不是一个明智的理由。 –

+0

有更好的方法来编写[IOCCC](http://ioccc.org)条目。 – devnull

回答

8

不,不是你在你的问题中特别提到的#include声明。而且,虽然我没有特别检查(a),但这可能是所有预处理指令的情况。

该标准规定的换行符是语法的一个组成部分(从C11 6.10.2 Source file inclusion):

形式# include <h-char-sequence>new-line...

可以地方的预处理指令#include指令之后发表的评论,因为在第3阶段发生了用单个空间替换评论,而预处理g指令在阶段4中处理(请参阅C11 5.1.1.2 Translation phases)。

但是,这并不能帮助你试图将非注释,如main()函数定义放在同一行,这仍然是一个禁忌。

但我的问题是:为什么要在地球上做这个?只需输出两行,并完成它。它不象我们痛苦的换行符一个全球性的短缺:-)


(一)乔纳森·莱弗勒已经检查,所以这种说法是几乎肯定是正确的。

根据ISO/IEC 9899:2011,§6。10个预处理指令:

# if恒定表达新行组选择
# ifdef标识符新行组选择
# ifndef标识符新行组选择
# elif常数-expression新行组选择
# else新行组选择
# endif新行
# includePP-令牌新行
# define标识符替换列表新行
# defineidentifier lparen identifie R级选择)替换列表换行
# define标识LPAREN ...)替换列表换行
# define标识LPAREN标识符表,...)替换列表新 - 线
# undef标识符新行
# linePP-令牌新行
# errorPP-令牌选择新行
# pragmaPP-令牌选择新行
#新线的线的

+0

这是否意味着我可以添加'\ n'来模拟新行。例如'#include \ n int main(int argc,const char ** argv){return 0; }由于注释部分的格式,这两行之间的分隔纯粹是巧合。应该阅读为一行 –

+0

@Brian,没有。首先,转义序列在阶段5中转换。其次,这只在字符常量和字符串文字中完成。 – paxdiablo

2

第一非白色字符为宏绝为#并且宏一直延伸到行结束(行结合后\个字符)。所以你不能“切断预处理器行”。

如果你想为一些疯狂的诡计答案做这个,你可以在编译过程中更好地使用-D/D(它永远适用)并完全避免宏。

一个健全的编程要求永远不会需要任何这样的功能。

+1

不幸的是,在我漫长的职业生涯中,我发现理智的要求非常重要:-) – paxdiablo