今天,我听到了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下编译。 有人可以帮我弄清楚这里遗漏的东西吗?或者我的想法出了什么问题?
答案 0 :(得分:1)
首先让我们非常清楚,重新定义像private
这样的语言关键字是未定义的,可能会以多种方式运作。
然后,关于您的功能,问题是您在定义函数之前创建#define
。试试这种方式:
void myfunc(int a)
{
cout << a << endl;
}
#define myfunc(a) 0
如果你按照最初提出的方式进行,那么在预处理之后就会结束这种情况,而这显然是非法的:
void 0(int a)
{
cout << a << endl;
}