【问题标题】:Can a C #error macro display multiple line message?C#error 宏可以显示多行消息吗?
【发布时间】:2019-02-22 11:28:51
【问题描述】:

我尝试像这样在 GCC 编译器中使用 #error 指令:

#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!"

【问题讨论】:

  • 尝试用反斜杠转义换行符。
  • 或者把\n放在错误信息字符串里面。
  • 或者干脆#error The charging pins aren't differing! One pin cannot be used for multiple purposes!
  • 我选择了最简单的方法,将“不能”改为“不能”。这里有高水平的语法和工程技能。
  • 也将“不是”改为“不是”?

标签: c string c-preprocessor directive


【解决方案1】:

不幸的是,你不能拥有这一切。

  • 要么您必须去掉撇号,以便消息仅包含被视为有效的预处理令牌。
  • 或者您可以将其写为一行中的字符串。
  • 或者您可以编写两个字符串文字并用\ 换行。您不能在字符串文字中间执行此操作,因为这样它就不是有效的预处理标记。不过,这会使输出看起来很奇怪,例如:error: "hello" "world"
  • 依赖两个字符串文字的预处理器连接将不起作用,因为错误指令只会查找到它在源代码中发现换行符。无论如何,错误指令都会将您输入的所有内容转换为字符串。

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

2) 每个反斜杠字符 () 的实例紧跟一个换行符 字符被删除,将物理源代码行拼接成逻辑源代码行。

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

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

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

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

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

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

稍微修正英文,您可以在可读源代码和可读错误消息之间获得最佳折衷。

【讨论】:

  • 没错,我就是这么做的。
  • 恭喜获得 100k!
【解决方案2】:

如上所述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;
}

【讨论】:

    猜你喜欢
    • 2016-04-05
    • 2011-09-30
    • 2014-09-05
    • 1970-01-01
    • 2016-06-06
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多