忽略函数名称定义宏的参数

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 

我对@9​​87654324@ 感兴趣。所以我尝试通过

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(&amp;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;

【讨论】:

以上是关于忽略函数名称定义宏的参数的主要内容,如果未能解决你的问题,请参考以下文章

使用可变参数宏的结构初始化数组

函数名传递与名称空间

高分求助VC中关于不定参数宏的使用

关于python中几个函数的用法

函数的一些基本知识

函数的参数