有没有办法在 C 预处理器宏中 'escape' 一个符号?
Is there a way to 'escape' an ampersand in a C preprocessor macro?
我有一个要从 Windows 移植到 Linux 的库,我需要进行最少数量的必要更改。
库中有一些函数调用,我需要调用其变体,少一个参数,我正在尝试使用宏来执行替换。
问题是这些调用正在传递结构的地址,我收到错误 "error: "&" may not appear in macro parameter list"
例如,如果图书馆有以下调用:
foo(param1, ¶m2);
我需要将其替换为
foo_variant(¶m2);
我在文件顶部添加条件编译如下:
#if defined LINUX_VARIANT
#define foo(param1, ¶m2) foo_variant(¶m2)
#endif
有什么方法可以 "escape" 符号来避免这个错误吗?
如果不是,我确实看到另一个 post 提到可以定义指向结构的指针,并使用指针而不是获取结构的地址,但我想避免这种情况,除非有别无选择。
在此先感谢您的启发!
只需转发整个参数表达式:
#define foo(param1, param2) foo_variant(param2)
请注意,由于预处理器的限制,如果任何参数包含逗号,此宏将失败。
Quentin 的回答是正确的,但要提供更多背景知识:预处理器将 文本 将任何 foo(...
替换为 foo_variant(...
并且还将 textually替换参数。如果 C 源文件中的一个参数有一个符号,它只会将其视为参数的一部分。
所以预处理器不能在它的定义中接受一个符号,它可以在它的扩展中接受一个符号。有:
#if defined LINUX_VARIANT
#define foo(param1, param2) foo_variant(¶m2)
#endif
然后
foo(p1, p2);
将被
取代
foo_variant(&p2);
我有一个要从 Windows 移植到 Linux 的库,我需要进行最少数量的必要更改。 库中有一些函数调用,我需要调用其变体,少一个参数,我正在尝试使用宏来执行替换。
问题是这些调用正在传递结构的地址,我收到错误 "error: "&" may not appear in macro parameter list"
例如,如果图书馆有以下调用:
foo(param1, ¶m2);
我需要将其替换为
foo_variant(¶m2);
我在文件顶部添加条件编译如下:
#if defined LINUX_VARIANT
#define foo(param1, ¶m2) foo_variant(¶m2)
#endif
有什么方法可以 "escape" 符号来避免这个错误吗?
如果不是,我确实看到另一个 post 提到可以定义指向结构的指针,并使用指针而不是获取结构的地址,但我想避免这种情况,除非有别无选择。 在此先感谢您的启发!
只需转发整个参数表达式:
#define foo(param1, param2) foo_variant(param2)
请注意,由于预处理器的限制,如果任何参数包含逗号,此宏将失败。
Quentin 的回答是正确的,但要提供更多背景知识:预处理器将 文本 将任何 foo(...
替换为 foo_variant(...
并且还将 textually替换参数。如果 C 源文件中的一个参数有一个符号,它只会将其视为参数的一部分。
所以预处理器不能在它的定义中接受一个符号,它可以在它的扩展中接受一个符号。有:
#if defined LINUX_VARIANT
#define foo(param1, param2) foo_variant(¶m2)
#endif
然后
foo(p1, p2);
将被
取代foo_variant(&p2);