我在头文件中声明了一个测试类,并在一个单独的文件中定义。该类必须在Windows下进行不同的编译,因此我使用#if defined ( _WINDOWS_ )
。当我编译同样包含#if defined ( _WINDOWS_ )
的cpp文件时,文件被编译为好像没有定义符号_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
}
错误代码:错误lnk2019未解析的外部符号public
注意:如果我直接定义该功能,它可以正常工作
// test.h
class Test
{
public:
#if defined (_WINDOWS_)
void printwindow(){couT << "i am window" }
#endif
void notwindows();
};
但我不喜欢这种方法。我更喜欢在单独的文件(h和cpp)中定义它们。
答案 0 :(得分:7)
最好使用_WIN32
代替_WINDOWS_
进行条件编译测试。 _WINDOWS_
仅在包含windows.h
时定义,而编译器自动为Windows目标的任何构建定义_WIN32
,无论包含哪些头。在您的情况下,_WINDOWS_
在您编译main.cpp
时定义,但在编译test.cpp
时未定义,因为test.cpp
不包括windows.h
。
此外,_WINDOWS_
宏定义是windows.h
标头的实现细节,不保证使用。例如,windows.h
的MinGW版本未定义_WINDOWS_
。
答案 1 :(得分:3)
您需要在test.cpp文件中包含windows.h
编译test.cpp时,它没有定义_WINDOWS_
符号。所以它创建了一个没有windows函数的目标文件。
然后在test.hpp中它使用符号,因为你在main.cpp中包含了windows.h
如果更改包含的顺序,它将表现不同。您应该重新考虑如何选择不依赖于包含顺序的Windows版本(例如,请参阅有关_WIN32_
的其他答案)。
您无法使用另一个代码文件(main.cpp)中的某个define更改已编译的目标文件(test.cpp)中的代码