今天幫同學解決了一個問題,之前其實也遇到過,現在總結一下。問題大概是這樣的,假設有如下代碼:
#include <tchar.h> DWORD g_count = 0; int _tmain(int argc, _TCHAR* argv[]) { return 0; }
使用VS編譯會報如下錯誤:
1>f:\testproj\consoletest_vs2005\test\test.cpp(3) : error C2146: syntax error : missing ';' before identifier 'g_count' 1>f:\testproj\consoletest_vs2005\test\test.cpp(3) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 1>f:\testproj\consoletest_vs2005\test\test.cpp(3) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
這是什么原因呢?仔細看第一個error,說是在g_count前丟失了分號,這讓人很費解,g_count前怎么會需要分號呢?!再看第二個error,說是丟失了類型說明符,這也很奇怪,這里明明是把g_count定義成了DWORD類型。
那么問題到底出在哪里呢?實際上原因是:DWORD並不是C++的原生類型,它是經過重定義的。這就可以理解為什么會出現上面的錯誤了,原來是因為沒有看到DWORD的定義!將光標點到DWORD,再按Alt+G可以看到DWORD是定義在了windef.h文件里,因此只要再#include<Windows.h>文件就可以編譯通過了(這里不能直接#include<WinDef.h>,因為還涉及到其它類型的定義)。