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

时间:2017-04-26 02:34:21

标签: c c-preprocessor solaris

这与Multi line preprocessor macros有关。我对#if#elif感兴趣,而不是定义的宏。例如,以下是否有效:

#if defined(X) || defined(Y) || \
    defined(Z)
...
#endif

我问的原因是Clang,GCC和MSVC接受了它,但Solaris上的一些Sun工具正在抱怨它。 GCC记录1.2 Initial processing“反斜杠 - 换行”“续行”)的行为,但像DBX这样的Sun工具遇到内部错误。

1 个答案:

答案 0 :(得分:6)

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

  

第2阶段

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

    ...

         

    第4阶段

         
        
    1. 执行预处理程序。
    2.   

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