我可以评论多行宏吗?

qua*_*ant 13 c++ macros

我正在编写一些大的宏,并认为如果我可以为它们添加注释会很好,就像这样:

#define SOME_BIG_MACRO(input)\
  SOME_FUNCTION_CALL() \ // this does...
  SOME_OTHER_FUNCTION_CALL()
Run Code Online (Sandbox Code Playgroud)

当我运行这个时,我得到:

prog.cpp:9:2:错误:在程序中迷路'\'

有什么方法可以解决这个问题,还是不可能对多行宏进行评论?

Ale*_*ukh 21

// comments除了宏的最后一行之外,没有办法在宏中使用.

正如Paul R所暗示的那样,/* comment */确实有效并且似乎是唯一的选择:

#define SOME_BIG_MACRO(input)\
  SOME_FUNCTION_CALL()  /* this does... */ \
  SOME_OTHER_FUNCTION_CALL()
Run Code Online (Sandbox Code Playgroud)

原因如下.编程语言C++标准(我只能访问此草案)指定源文件的物理行可以连接成编译器将使用\后跟换行符所看到的逻辑行:

删除反斜杠字符()后面紧跟一个新行字符的每个实例,拼接物理源代码行以形成逻辑源代码行.只有任何物理源线上的最后反斜杠才有资格成为此类拼接的一部分.

这可以在预处理器输出中轻松检查:create file.cppwith

pri\
ntf ("Hell\
o world"\
);
Run Code Online (Sandbox Code Playgroud)

然后

cpp file.cpp
Run Code Online (Sandbox Code Playgroud)

printf ("Hello world");
Run Code Online (Sandbox Code Playgroud)

要么

printf 
    ("Hello world");
Run Code Online (Sandbox Code Playgroud)

这是编译器看到的(在Ubuntu中检查;您的里程可能会有所不同).

现在,将此规则应用于多行宏,

#define SOME_BIG_MACRO(input)\
  SOME_FUNCTION_CALL() \
  SOME_OTHER_FUNCTION_CALL()
Run Code Online (Sandbox Code Playgroud)

被预处理器理解为

#define SOME_BIG_MACRO(input)   SOME_FUNCTION_CALL()   SOME_OTHER_FUNCTION_CALL()
Run Code Online (Sandbox Code Playgroud)

因为\忽略了所有和下一个换行符.

同样的,

#define SOME_BIG_MACRO(input)\
  SOME_FUNCTION_CALL()  /* this does... */ \
  SOME_OTHER_FUNCTION_CALL()
Run Code Online (Sandbox Code Playgroud)

被预处理器视为

#define SOME_BIG_MACRO(input)   SOME_FUNCTION_CALL()  /* this does... */   SOME_OTHER_FUNCTION_CALL()
Run Code Online (Sandbox Code Playgroud)

然而,

#define SOME_BIG_MACRO(input)\
  SOME_FUNCTION_CALL()  \ // this does...
  SOME_OTHER_FUNCTION_CALL()
Run Code Online (Sandbox Code Playgroud)

变成两行:

#define SOME_BIG_MACRO(input)   SOME_FUNCTION_CALL()  \ // this does...
  SOME_OTHER_FUNCTION_CALL()
Run Code Online (Sandbox Code Playgroud)

因为第二个\没有后跟换行符因此被保留,以及换行符之前没有换行符\.这会导致编译错误.

#define SOME_BIG_MACRO(input)\
  SOME_FUNCTION_CALL()  // this does... \
  SOME_OTHER_FUNCTION_CALL()
Run Code Online (Sandbox Code Playgroud)

成为一条线:

#define SOME_BIG_MACRO(input)  SOME_FUNCTION_CALL()  // this does...   SOME_OTHER_FUNCTION_CALL()
Run Code Online (Sandbox Code Playgroud)

这在语法上是正确的,但宏是不完整的.一些编译器将此报告为错误,因为很可能这不是程序员的意图.其他人,比如Ubuntu cc,默默地应用标准定义的规则.

由于宏只能占用一条逻辑行(尽管有几条物理行,使用换行符转义机制),// comment因此该行中的任何一行都会导致忽略宏的所有其余部分.

结论:a // comment只能出现在(多行或单行)宏的末尾,而/* comment */完全可以在宏内部使用.

  • 完成.根据要求,我修改了答案,添加了对标准的引用及其详细说明. (3认同)

Dr.*_*ana 6

行注释 // 不行,只能阻止注释 /* ... */ 例如

#define SOME_BIG_MACRO(input)\
  SOME_FUNCTION_CALL() /* this does... */ \ 
  SOME_OTHER_FUNCTION_CALL()
Run Code Online (Sandbox Code Playgroud)