忽略函数名为

时间:2015-11-05 02:56:58

标签: c++ visual-c++ visual-studio-2013 c-preprocessor

今天,我听到了C ++程序员可以通过#define关键字完成的一些恶魔。例如,

#define private public
#define class struct
#define sizeof(x) (sizeof(x) - 1)
#define true (__LINE__ % 2)
#define pthread_mutex_lock(m) 0 

我对function definition感兴趣。所以我尝试通过

进行测试
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下编译。 有人可以帮我弄清楚这里遗漏的东西吗?或者我的想法出了什么问题?

1 个答案:

答案 0 :(得分:1)

首先让我们非常清楚,重新定义像private这样的语言关键字是未定义的,可能会以多种方式运作。

然后,关于您的功能,问题是您在定义函数之前创建#define 。试试这种方式:

void myfunc(int a)
{
    cout << a << endl;
}

#define myfunc(a) 0

如果你按照最初提出的方式进行,那么在预处理之后就会结束这种情况,而这显然是非法的:

void 0(int a)
{
    cout << a << endl;
}