我在头文件中声明了一个测试类,并在一个单独的文件中定义.该类必须在Windows下进行不同的编译,所以我使用#if defined ( _WINDOWS_ ).当我编译同时包含的cpp文件时#if defined ( _WINDOWS_ ),文件被编译为好像_WINDOWS_未定义符号,尽管它是在另一个文件中定义的.当我编译代码时,我收到以下错误:
错误代码:错误lnk2019未解析的外部符号public
源代码
// test.h
class Test
{
public:
#if defined (_WINDOWS_)
void printwindow();
#endif
void notwindows();
};
//test.cpp
#include "test.h"
#if defined (_WINDOWS_)
void Test::printwindow()
{
cout << "i am windows ";
}
#endif
void test::notwindows()
{
cout << " not windows " ;
}
//main.cpp
#include "windows.h"
#include "test.h"
void main()
{
test t1 ;
t1.printwindow() // OK I have declared function so my _WINDOWS_ is available but when i run it i get
}
Run Code Online (Sandbox Code Playgroud)
错误代码:错误lnk2019未解析的外部符号public
注意:如果我直接定义函数它没有任何问题
// test.h
class Test
{
public:
#if defined (_WINDOWS_)
void printwindow(){couT << "i am window" }
#endif
void notwindows();
};
Run Code Online (Sandbox Code Playgroud)
但我不喜欢这种方法.我更喜欢在单独的文件(h和cpp)中定义它们.
最好使用_WIN32而不是_WINDOWS_进行条件编译测试. _WINDOWS_只有windows.h在包含的情况下才会定义,而编译器会自动_WIN32为Windows目标的任何构建定义,无论包含哪些头.在您的情况下,_WINDOWS_在编译main.cpp时定义,但在编译时不定义test.cppbecuase test.cpp不包括windows.h.
此外,_WINDOWS_宏定义是windows.h标头的实现细节,并不保证使用.例如,MinGW版本windows.h没有定义_WINDOWS_.