2015-11-05 90 views
0

今天,我聽到一些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

如果代碼中有'#定義InitializeCriticalSection(n,y)0',然後'InitializeCriticalSection(&g_critSec);'必須產生一個錯誤。如果您似乎獲得不同的結果,請發佈[MCVE](http://stackoverflow.com/help/mcve) –

+0

這可能是某種MSVC「擴展」 –

+1

@ M.M:又名「bug」 – rici

回答

1

首先讓我們非常清楚的是,重新定義private這樣的語言關鍵字未定義,並可能以各種方式運行。

然後,至於你的功能,問題是你在之前創建#define你定義了這個函數。試着這樣說:

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

#define myfunc(a) 0 

如果你這樣做,你最初提議的方式,你會預處理後風與此,而很明顯違法:

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