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

时间:2018-09-18 12:15:03

标签: c string c-preprocessor directive

我尝试将#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!"

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

那么问题是:我如何实现此输出? (或类似的双引号,但包括撇号)

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

2 个答案:

答案 0 :(得分:5)

不幸的是,您无法拥有全部。

  • 要么必须除去撇号,以便消息仅包含被视为有效的预处理令牌。
  • 或者您也可以将其写为一行。
  • 或者您可以将其写成两个字符串文字,并以\换行。您不能在字符串文字中间进行此操作,因为那样的话,它将不是有效的预处理令牌。但这会使输出看起来很奇怪,例如:error: "hello" "world"
  • 依靠预处理程序对两个字符串文字的连接是行不通的,因为error指令只会在源中发现换行符后才会出现。而且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!

英文稍作修正,您会在可读源和可读错误消息之间取得最佳折衷。

答案 1 :(得分: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;
}