Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 反斜杠换行符在#if and#elif上有效吗?_C_C Preprocessor_Solaris - Fatal编程技术网

C 反斜杠换行符在#if and#elif上有效吗?

C 反斜杠换行符在#if and#elif上有效吗?,c,c-preprocessor,solaris,C,C Preprocessor,Solaris,这是有关的。我感兴趣的是#if或#elif,而不是正在定义的宏。例如,以下各项是否有效: #if defined(X) || defined(Y) || \ defined(Z) ... #endif 我问的原因是Clang、GCC和MSVC接受它,但Solaris上的一些Sun工具对此表示不满。GCC在(“反斜杠换行”和“续行”)处记录了行为,但是像DBX这样的Sun工具遇到了一个内部错误。它们是有效的,因为在第2阶段中,在第4阶段中完成预处理之前,会删除换行前的反斜杠 第二阶段 每

这是有关的。我感兴趣的是
#if
#elif
,而不是正在定义的宏。例如,以下各项是否有效:

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

我问的原因是Clang、GCC和MSVC接受它,但Solaris上的一些Sun工具对此表示不满。GCC在(“反斜杠换行”和“续行”)处记录了行为,但是像DBX这样的Sun工具遇到了一个内部错误。

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

第二阶段
  • 每当反斜杠出现在行尾(紧跟着换行符),反斜杠和换行符都会被删除,将两个物理源行合并为一个逻辑源行。这是一个单程操作:以两个反斜杠结尾并后跟空行的行不会将三行合并为一行
  • 第四阶段
  • 执行预处理器

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

    第二阶段
  • 每当反斜杠出现在行尾(紧跟着换行符),反斜杠和换行符都会被删除,将两个物理源行合并为一个逻辑源行。这是一个单程操作:以两个反斜杠结尾并后跟空行的行不会将三行合并为一行
  • 第四阶段
  • 执行预处理器

  • 确保在行尾(反斜杠之后、换行之前)没有回车符。否则,就没有问题了。您应该确定哪些Sun工具存在问题。很长一段时间以来,我从未在任何平台上看到过这样的问题,但在过去五年左右的时间里,我在Solaris上没有做过多少工作,事情可能已经发生了变化(但我认为不太可能)。请注意,反斜杠换行分析在输入标记化之前进行。只要下一行没有前导空格,就可以用反斜杠换行来拆分关键字。@JonathanLeffler-反斜杠后面不应该有空格。我们的makefile有一个空白,其他工具如GCC不会警告额外的空白。有关Sun tools中的错误示例,请参阅。我在Solaris 9上使用了Sun编译器更多—在Solaris 10上运行结果—但我没有使用Solaris 11。(让我恼火的是,跟上前沿环境并不重要。)令人困惑的是,当其他编译器接受它时,编译器生成的代码会崩溃;这类事情往往会阻碍展示,或者导致切换到其他编译器。有时,问题在于行为不明确;这大概不是代码中的问题。我不清楚问题是否出在反斜杠上,但我没有详细研究代码。你说的这些Sun工具是什么?太阳死了…;-)假设你在运行Studio 12.5,有什么抱怨?我没有看到过这样的问题,但我现在不记得我是否在12.5中实际使用了
    dbx
    。请确保在行尾(反斜杠之后,换行之前)没有回车符。否则,就没有问题了。您应该确定哪些Sun工具存在问题。很长一段时间以来,我从未在任何平台上看到过这样的问题,但在过去五年左右的时间里,我在Solaris上没有做过多少工作,事情可能已经发生了变化(但我认为不太可能)。请注意,反斜杠换行分析在输入标记化之前进行。只要下一行没有前导空格,就可以用反斜杠换行来拆分关键字。@JonathanLeffler-反斜杠后面不应该有空格。我们的makefile有一个空白,其他工具如GCC不会警告额外的空白。有关Sun tools中的错误示例,请参阅。我在Solaris 9上使用了Sun编译器更多—在Solaris 10上运行结果—但我没有使用Solaris 11。(让我恼火的是,跟上前沿环境并不重要。)令人困惑的是,当其他编译器接受它时,编译器生成的代码会崩溃;这类事情往往会阻碍展示,或者导致切换到其他编译器。有时,问题在于行为不明确;这大概不是代码中的问题。我不清楚问题是否出在反斜杠上,但我没有详细研究代码。你说的这些Sun工具是什么?太阳死了…;-)假设你在运行Studio 12.5,有什么抱怨?我没有见过这样的问题,但我现在不记得我是否实际使用了<代码> dx< /COD> 12.5。这是C++的引用。问题被标记为C和C预处理器。参考5.1.1.2翻译阶段,第2段:“删除紧跟在新行字符后面的反斜杠字符(\)的每个实例,拼接物理源行以形成逻辑源行。”@AndrewHenle谢谢,我刚刚修复了链接和引号Ethanks@LưuVĩnhPhúc。我猜我们遇到了一个Solaris bug。这是C++引用。问题被标记为C和C预处理器。参考5.1.1.2翻译阶段,第2段:“删除紧跟在新行字符后面的反斜杠字符(\)的每个实例,拼接物理源行以形成逻辑源行。”@AndrewHenle谢谢,我刚刚修复了链接和引号Ethanks@LưuVĩnhPhúc。我想我们遇到了Solaris错误。