反斜杠 - 换行符在#if和#elif上有效吗?

jww*_*jww 1 c solaris c-preprocessor

这与多行预处理器宏有关.我对#ifor 感兴趣#elif,而不是定义宏.例如,以下是否有效:

#if defined(X) || defined(Y) || \
    defined(Z)
...
#endif
Run Code Online (Sandbox Code Playgroud)

我问的原因是Clang,GCC和MSVC接受它,但Solaris上的一些Sun工具正在抱怨它.GCC记录1.2初始处理时的行为("反斜杠换行"和"续行"),但像DBX这样的Sun工具遇到内部错误.

phu*_*clv 6

它们是有效的,因为在第4阶段完成预处理之前,第2阶段会删除换行符之前的反斜杠.

阶段2

  1. 每当反斜杠出现在一行(紧接着是换行符)后,反斜杠和换行都会被删除,将两条物理源行合并为一条逻辑源行.这是一次单行操作:以两个反斜杠结尾的行后跟一个空行不会将三行合并为一行.

...

第4阶段

  1. 执行预处理程序.

http://en.cppreference.com/w/c/language/translation_phases