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


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


11726
2017-07-28 04:17


起源

我意识到我可以 typedef unsigned char byte 达到隐含的效果,但我有兴趣实现 #define "foo bar" barfoo......如果只有可能的话。 - omatai
不,它必须是标识符。也许有一个你想要实现的真实例子,有一个更好的方法。 - chris
我大多想排除这种可能性。我正在将一堆代码从linux / C移植到Windows / C ++,以便快速推出可能的开发路径。如果可能的话,它会使每个头文件的一个更改与多个之间产生差异。但我决定用这句话来说明一个更普遍 - 更有趣 - 的问题。 - omatai


答案:


一个标识符 #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 相同标准,并没有将空格字符列为允许的字符之一。


6
2017-07-28 04:26





#define语法由。定义

#define identifier token-string

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


4
2017-07-28 04:24





虽然接受的答案在技术上完全正确,但可能不会立即明确 #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__ )

1
2017-08-12 01:54