2010-07-22 32 views
2

可能重复:
How can I make the preprocessor insert linebreaks into the macro expansion result?我可以强制C预处理器生成新行吗?

#define IDENTIFIER { /*new line here*/\ 
      my_multiline(); /*new line here*/\ 
      macro(); /*new line here*/\ 
     } /*new line here*/ 

我可以强制Ç预处理器生成一个新的生产线,在它的扩张?我不相信有一个标准的方法来做到这一点,但我不介意Visual C++(2008)和gcc的特定于平台的黑客攻击。

我不想通过m4或单独的预处理器来完成此操作。

为什么我问这

这或多或少只是好奇。由于这是一个黑客,我不会在生产中尝试这个,但我想知道我是否能够做到这一点。前几天我偶然到了这个问题:

Can you turn off (specific) compiler warnings for any header included from a specific location?

这是我想解决自己的问题。我想创建一个用于包含头部的宏,但是使用正确的编译指示可以在包含之前禁用警告,包括我希望关闭警告的头部,在包含之后启用警告。

当然,我可以创建一个脚本来生成包含警告和包含的附注的模拟包含。

我的第一个问题是,由于#include是一个预处理器指令,所以一个宏在生成它时会有点无用。但后来我发现这个答案:

Is there a way to do a #define inside of another #define?

有了这个,我相信我可以产生特殊的宏包括如果我能够迫使编译器生成的换行符在它的扩张。

我现在在家,但明天我会在工作时发布我的代码。

+1

您的#define需要一个标识符。无论如何,空白的目的是什么?你永远不会看到扩展的代码。 – GManNickG 2010-07-22 23:32:00

+0

@GMan:他可能只是希望宏本身更具可读性。 – CookieOfFortune 2010-07-22 23:32:53

+3

你能否提供一些背景知道你为什么要这样做?是否有你想写的特定宏?也许你的问题有不同的解决方案。 – 2010-07-22 23:33:06

回答

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(); 
} 

这有附加的好处是被类型检查(并且通常不太容易出错)。

+1

不要走宏开心,你会后悔的。等一下。你不会后悔,但是维护程序员之后,你会诅咒你曾经对代码进行过指责的那一天。 :) – 2010-07-23 00:03:30

+0

@C约翰逊:除非在这种情况下的“维护程序员”是你自己。 – 2010-07-23 02:12:25

+0

+1 for inline ....我不喜欢在你的答案#defined上面的“d”;-) – KedarX 2010-07-23 13:16:35

相关问题