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

use*_*528 2 c++

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

Mic*_*urr 7

最好使用_WIN32而不是_WINDOWS_进行条件编译测试. _WINDOWS_只有windows.h在包含的情况下才会定义,而编译器会自动_WIN32为Windows目标的任何构建定义,无论包含哪些头.在您的情况下,_WINDOWS_在编译main.cpp时定义,但在编译时不定义test.cppbecuase test.cpp不包括windows.h.

此外,_WINDOWS_宏定义是windows.h标头的实现细节,并不保证使用.例如,MinGW版本windows.h没有定义_WINDOWS_.