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

pro*_*odx 2 c string directive c-preprocessor

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

#error "The charging pins aren't differing! One pin cannot be used for multiple purposes!"
Run Code Online (Sandbox Code Playgroud)

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

#error "The charging pins aren't differing! 
    One pin cannot be used for multiple purposes!"
Run Code Online (Sandbox Code Playgroud)

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

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

error: missing terminating " character
cannot be used for multiple purposes!"
Run Code Online (Sandbox Code Playgroud)

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

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

#error "The charging pins aren't differing! One pin cannot be used for multiple purposes!"
Run Code Online (Sandbox Code Playgroud)

Lun*_*din 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!
Run Code Online (Sandbox Code Playgroud)

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