如何使用 C 宏替换被调用函数?
How to replace callee function using C macro?
我在使用 C 宏时遇到问题,想知道是否有人可以提供帮助。
我正在尝试使用 C 宏替换被调用函数或删除函数调用的括号。被调用函数以函数调用的形式传递给宏
我想将代码转换成这样:
SOME_MACRO(any_function1(param0, param1)) -> myfunc(param0, param1)
SOME_MACRO(any_function2(param0, param1, param2)) -> myfunc(param0, param1, param2)
可以吗?
如有任何帮助,我们将不胜感激。
您不能编写像 SOME_MACRO(any_function(param0, param1))
这样的宏,因为内容将被视为一个单独的预处理器标记,您将无法获取其中的 any_function
部分。
而是简单地做 #define any_function other_function
.
更高级的主题:如果您需要更改参数或添加类型安全等,请创建一个“包装器宏”。以这个人造宏为例:
#define any_function(x, y) _Generic((x), int: other_function) (x,y,z)
这个例子做了 3 件事:
- 将对
any_function
的调用替换为 other_function
- 对第一个参数执行比简单函数调用所需的更严格的类型安全。例如,如果您要求
x
参数 必须 是 int
而不是 unsigned int
、long
、short
或类似的,否则可以传递给以 int
作为参数的函数(将发生“左值转换”)。
- 出于兼容性原因,将第三个参数
z
添加到调用中,调用者代码中没有。同样,我们也可以删除其中一个参数或更改它们的顺序。
我在使用 C 宏时遇到问题,想知道是否有人可以提供帮助。
我正在尝试使用 C 宏替换被调用函数或删除函数调用的括号。被调用函数以函数调用的形式传递给宏
我想将代码转换成这样:
SOME_MACRO(any_function1(param0, param1)) -> myfunc(param0, param1)
SOME_MACRO(any_function2(param0, param1, param2)) -> myfunc(param0, param1, param2)
可以吗?
如有任何帮助,我们将不胜感激。
您不能编写像 SOME_MACRO(any_function(param0, param1))
这样的宏,因为内容将被视为一个单独的预处理器标记,您将无法获取其中的 any_function
部分。
而是简单地做 #define any_function other_function
.
更高级的主题:如果您需要更改参数或添加类型安全等,请创建一个“包装器宏”。以这个人造宏为例:
#define any_function(x, y) _Generic((x), int: other_function) (x,y,z)
这个例子做了 3 件事:
- 将对
any_function
的调用替换为other_function
- 对第一个参数执行比简单函数调用所需的更严格的类型安全。例如,如果您要求
x
参数 必须 是int
而不是unsigned int
、long
、short
或类似的,否则可以传递给以int
作为参数的函数(将发生“左值转换”)。 - 出于兼容性原因,将第三个参数
z
添加到调用中,调用者代码中没有。同样,我们也可以删除其中一个参数或更改它们的顺序。