编译时符号是#defined但#ifdef没有看到它

时间:2012-02-12 10:53:51

标签: c++

我在头文件中声明了一个测试类,并在一个单独的文件中定义。该类必须在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)中定义它们。

2 个答案:

答案 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)中的代码