gpt4 book ai didi

c - 用宏包装函数调用

转载 作者:行者123 更新时间:2023-11-30 14:50:54 25 4
gpt4 key购买 nike

是否可以仅用宏包装函数调用?

当我尝试时

#define foo(x) bar(x)

它包装了函数调用和定义。

我知道如何使用链接器包装函数,但在这种情况下我无法使用此解决方案。

让我们假设一些代码

#define foo(x) bar(z)

int foo(int z){
//some code
}

int bar(int x){
//some code
}

int function(){
int a = foo(2);
}

我想 int a = foo(2);预处理后变为 int a = bar(2)。目前我只收到“重新定义”错误。

编辑:我的示例显示了我想要实现的目标,但在实际代码中,我必须通过 cmake 文件将此宏放入项目中,而且我也无法修改目标文件中的源代码。抱歉没有提前提及。

最佳答案

使用 undef 来管理宏的生命周期,而不是破坏不知道宏存在的代码段。

int foo(int z){
//some code
}

int bar(int x){
//some code
}

int function(){
#define foo(x) bar(z)
int a = foo(2);
#undef foo
}

此技巧扩展到诸如 header 选项之类的内容,通常包含 Windows.h 之类的内容,并且 header 的定义取决于 header 外部定义的定义,如下所示:

#define WIN32_LEAN_AND_MEAN // used in ifdef checks to not define/include rarely used stuff
#define NO_STRICT // used to allow HANDLE types to be used as void * without type errors
#define NO_MINMAX // used to avoid errors because MIN/MAX are already defined
#include <Windows.h>

这会使用在 header 完成解析后无用的宏污染作用域,因此您可以通过在包含后取消定义它们来清理:

#define WIN32_LEAN_AND_MEAN // used in ifdef checks to not define/include rarely used stuff
#define NO_STRICT // used to allow HANDLE types to be used as void * without type errors
#define NO_MINMAX // used to avoid errors because MIN/MAX are already defined
#include <Windows.h>
#undef NO_MINMAX
#undef NO_STRICT
#undef WIN32_LEAN_AND_MEAN

这使得人们更容易阅读你的代码,特别是 C 初学者,知道这些是选项,在包含发生后没有任何用处。这还允许您执行有趣的类似 C++ 的行为,例如基于包含之前定义的定义进行模板化,而不会因多次包含 header 而发生冲突。

关于c - 用宏包装函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48690724/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com