C #error宏可以显示多行消息吗?

问题描述 投票:2回答:2

我尝试将#error指令与GCC编译器一起使用,如下所示:

#error "The charging pins aren't differing! One pin cannot be used for multiple purposes!"

This说,我应该使用双引号,所以参数将是一个单独的字符串常量,我可以在其中使用撇号。但是,我希望这个字符串出现在多行代码的源代码中,如:

#error "The charging pins aren't differing! 
    One pin cannot be used for multiple purposes!"

然后,我收到一些错误消息:

warning: missing terminating " character
#error "The charging pins aren't differing! One pin

error: missing terminating " character
cannot be used for multiple purposes!"

如果我在第一行的末尾插入一条黑色长片,则诊断消息将包含第二行开头和第一个单词(One)之间的所有空格。如果两行都是字符串,则诊断消息显示内部双引号。

所以问题是:我如何实现这一输出? (或类似的没有双引号,但包括撇号)

#error "The charging pins aren't differing! One pin cannot be used for multiple purposes!"
c string c-preprocessor directive
2个回答
5
投票

不幸的是,你无法拥有一切。

  • 要么你必须摆脱撇号,以便消息只包含被认为是有效的预处理令牌。
  • 或者您可以将其作为字符串写在一行上。
  • 或者你可以写两个字符串文字并用\打破这一行。您不能在字符串文字的中间执行此操作,因为它不会是有效的预处理标记。这将使输出看起来很奇怪,例如:error: "hello" "world"
  • 依赖于两个字符串文字的预处理器连接将不起作用,因为错误指令仅在它找到源中的换行符之前才会查找。而且,error指令会将您输入的所有内容转换为字符串。

相关的翻译阶段(从C17 5.1.1.2开始)按此顺序执行:

2)删除反斜杠字符()后面紧跟一个新行字符的每个实例,拼接物理源代码行以形成逻辑源代码行。

3)源文件被分解为预处理标记和空白字符序列(包括注释)。

4)执行预处理指令,......

6)连接相邻的字符串文字标记。

#error在步骤4中执行,早于步骤6中的字符串文字串联。

我个人认为最好的解决方案是跳过撇号:

#error The charging pins are not differing! \
       One pin cannot be used for multiple purposes!

轻微修复英语,您可以在可读源和可读错误消息之间获得最佳折衷。


0
投票

如上所述here

'#error'和'#warning'都没有扩大其论点。内部空白序列每个都用一个空格替换。该行必须包含完整的令牌。最明智的做法是使这些指令的参数为单个字符串常量;这避免了撇号等问题。

所以你只能在一行中使用它。

#include <stdio.h>
//#define var 10
#ifdef var
#error "The charging pins aren't differing! One pin cannot be used for multiple purposes!"
#endif
int main(void){
  printf("in  main() \n");
  return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.