可能重复:
How can I make the preprocessor insert linebreaks into the macro expansion result?
#define IDENTIFIER { /*new line here*/\
my_multiline(); /*new line here*/\
macro(); /*new line here*/\
} /*new line here*/
我可以强制 C 预处理器在其扩展中生成新行吗?我不相信有一种标准的方法可以做到这一点,但我不介意针对Visual C ++(2008)和gcc的平台特定黑客。
我对通过m4或单独的预处理器执行此操作不感兴趣。
为什么我要问这个:
这或多或少只是好奇心。因为它是一个黑客,我不会在生产中尝试这个,但我想知道我是否能够这样做。几天前,我偶然发现了这个问题:
Can you turn off (specific) compiler warnings for any header included from a specific location?
这是一个我自己想要解决的问题。我考虑过创建一个包含标题的宏,但是使用正确的pragma来禁用包含之前的警告,包括我要关闭警告的标题,在include之后启用警告。
当然,我可以创建一个脚本来生成带有警告和包含的编译指示的模拟包含。
我的第一个问题是,由于#include
是预处理器指令,因此宏生成它有点无用。但后来我找到了答案:
Is there a way to do a #define inside of another #define?
有了这个,我相信如果我能够强制编译器在它的扩展中生成换行符,我可以生成特殊的包含宏。
我现在在家,但明天我在工作时会发布我的代码。
答案 0 :(得分:6)
如果您只是想在调试器中使代码更具可读性,则可以使用inline
函数而不是#defined
宏。不幸的是,inline关键字是C的C99补充,只有ANSI C下的专有扩展支持(如MSVC)。
#if __STDC_VERSION__ < 199901L
# if defined(_MSC_VER)
# define inline __inline
# elseif defined(__GNUC__)
# define inline __inline__
# endif
#endif
static inline void IDENTIFIER() {
my_multiline();
macro();
}
这具有进行类型检查的额外好处(并且通常不易出错)。