我能强制C预处理器生成新的一行吗?

3

可能重复:
如何使预处理器在宏展开结果中插入换行符?

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

我能否强制C预处理器在其扩展中生成新行?我不认为有标准的方法来做到这一点,但我不介意针对Visual C++(2008)和gcc的特定平台的黑客方式。
我不想通过m4或单独的预处理器来实现这一点。
为什么我要问这个问题:
这更多的只是出于好奇心。由于这是一个黑客,我不会在生产中尝试这样做,但我想知道是否能够这样做。几天前,我遇到了这个问题: 您可以关闭从特定位置包含的任何头文件的(特定)编译器警告吗? 这是一个我自己想要解决的问题。我考虑创建一个宏来包含一个头文件,但是正确的pragma可以在包含之前禁用警告,包含我想要关闭警告的头文件,在包含后启用警告。
当然,我可以创建一个脚本来生成带有警告和包含的模拟包含文件。

我的第一个问题是,由于#include是一个预处理指令,使用宏来生成它有点无用。但后来我找到了这个答案:

有没有办法在另一个#define中定义#define?

通过这个答案,我相信如果我能强制编译器在展开时生成新行,就可以生成特殊的包含宏。

我现在在家里,但明天上班时我会发布我的代码。


1
你的 #define 需要一个标识符。而且空格有什么用呢?你永远看不到扩展后的代码。 - GManNickG
3
你能否介绍一下为什么你想要这么做?你是否正在尝试编写特定的宏?也许有一种不同的解决方案适合你的问题。 - Matt Curtis
2
没有便携或标准的方法来做到这一点。在预处理指令被评估之后,换行符不再具有重要意义,因此没有理由保留它们。 - James McNellis
@James McNellis 我认为没有标准的方法来做这件事。正如我所说,我会接受平台特定的解决方案。 - Vitor Py
@Vitor:我看到了,因此我将其作为评论而不是答案发布。 :-) - James McNellis
显示剩余3条评论
1个回答

6

如果你只是想在调试器中使代码更易读,可以使用内联函数而不是#定义宏。不幸的是,内联关键字是C99对C的补充,在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
不要过度使用宏,否则你会后悔的。等一下。你可能不会后悔,但是接手维护工作的程序员们会诅咒你曾经动过这段代码的那一天。 :) - C.J.
@C Johnson:除非这种情况下的“维护程序员”是你自己。 - Billy ONeal
在你的答案中,我不喜欢上面 #defined 中最后一个 "d";-) 在行内加1。 - KedarX

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接