是否可以#define两个单词到一个表达式,而不只是一个单词?

时间:2014-07-28 04:17:58

标签: c++ c c-preprocessor

如果我想用byte替换所有出现的unsigned char,那么简单#define就可以做到。有没有办法用#define做反向?使用单引号或双引号对两个单词进行分组不起作用,也不使用反斜杠转义它们之间的空格。它甚至可能吗?

3 个答案:

答案 0 :(得分:6)

#define语句中的标识符不能包含空格,至少在C中。

C11标准的控制部分(虽然在早期迭代中基本相同)是6.10.3 Macro replacement /9-10(下面合并):

  

形式的预处理指令

  # define identifier replacement-list new-line
  # define identifier lparen identifier-listopt ) replacement-list new-line
  # define identifier lparen ... ) replacement-list new-line
  # define identifier lparen identifier-list , ... ) replacement-list new-line

  等等等等......

identifier(在这些指令中使用)在同一标准的6.4.2中指定,并且不会将空格字符列为允许的字符之一。

答案 1 :(得分:5)

#define语法由

定义
#define identifier token-string

所以中间部分应该是一个标识符,不能包含空格。

答案 2 :(得分:1)

虽然接受的答案在技术上完全正确,但可能不会立即明确给出#define语法允许的内容:

extern CString outputString;
#define printf( ... ) { CString temp; temp.Format( __VA_ARGS__ ); outputString += temp; }

您真正需要了解的唯一元素是...__VA_ARGS__。它们代表零个或多个令牌的列表。所以这是#define将解释(但实质上忽略)空格的限制性示例,并允许您将多个单词更改为不同的单词。

虽然我自己从来没有这样做过,大概是你有一个带默认参数的函数,并且调用那个似乎有一个可变长度参数列表的函数(即使真正的参数列表是固定长度的)你仍然可以使用...语法和__VA_ARGS__来调用兼容的函数:

#define ThreeParamFunction( x, ... ) FiveParamFunction( foo, bar, (x), __VA_ARGS__ )