忽略函数名称定义宏的参数
Posted
技术标签:
【中文标题】忽略函数名称定义宏的参数【英文标题】:Ignoring the parameters for define macro with function name 【发布时间】:2015-11-05 02:56:57 【问题描述】:今天,我听到了一些 C++ 程序员可以通过#define
关键字做的鬼事。例如,
#define private public
#define class struct
#define sizeof(x) (sizeof(x) - 1)
#define true (__LINE__ % 2)
#define pthread_mutex_lock(m) 0
我对@987654324@ 感兴趣。所以我尝试通过
CRITICAL_SECTION g_critSec;
#define InitializeCriticalSection(n, y) 0
void comparemutexwithcriticalsection()
InitializeCriticalSection(&g_critSec);
std::cout << "Iterations: " << g_cRepeatCount << "\n\r";
// other codes...
在VS2013下可以编译成功,下面是反汇编代码。
void comparemutexwithcriticalsection()
00F9A710 push ebp
00F9A711 mov ebp,esp
00F9A713 sub esp,0CCh
00F9A719 push ebx
00F9A71A push esi
00F9A71B push edi
00F9A71C lea edi,[ebp-0CCh]
00F9A722 mov ecx,33h
00F9A727 mov eax,0CCCCCCCCh
00F9A72C rep stos dword ptr es:[edi]
InitializeCriticalSection(&g_critSec);
std::cout << "Iterations: " << g_cRepeatCount << "\n\r";
00F9A72E push 0FB66F4h
InitializeCriticalSection(&g_critSec);
似乎#define
宏中的参数被忽略了,对吗?
基于上述,我尝试将define
我自己的功能作为0
#define myfunc(a) 0
void myfunc(int a)
cout << a << endl;
但是在VS2013下编译失败。 有人可以帮我找出这里缺少的东西吗?还是我的想法有问题?
【问题讨论】:
如果代码有#define InitializeCriticalSection(n, y) 0
,那么InitializeCriticalSection(&g_critSec);
一定会产生错误。如果您似乎得到了不同的结果,请发帖MCVE
这可能是某种 MSVC “扩展”
【参考方案1】:
首先让我们明确一点,重新定义语言关键字(如 private
)是未定义的,并且可能以多种方式表现。
那么,至于你的函数,问题是你在定义函数之前创建了#define
。试试这个方法:
void myfunc(int a)
cout << a << endl;
#define myfunc(a) 0
如果你按照你最初提议的方式去做,你会在预处理后得到这个,而这显然是非法的:
void 0(int a)
cout << a << endl;
【讨论】:
以上是关于忽略函数名称定义宏的参数的主要内容,如果未能解决你的问题,请参考以下文章