编译时符号被#定义,但#ifdef看不到它
A compile-time symbol was #defined but #ifdef does not see it
我有一个测试类在头文件中声明,并在单独的文件中定义。这个类在Windows下必须以不同的方式编译,所以我使用#if defined ( _WINDOWS_ )
。当我编译同样包含#if defined ( _WINDOWS_ )
的cpp文件时,尽管符号_WINDOWS_
是在另一个文件中定义的,但编译该文件时,就好像它没有定义一样。当我编译代码时,我得到以下错误:
错误代码:错误lnk2019未解析的外部符号公共
源代码
// 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未解析的外部符号公共
注意:如果我直接定义函数,它可以正常工作,没有任何问题
// test.h
class Test
{
public:
#if defined (_WINDOWS_)
void printwindow(){couT << "i am window" }
#endif
void notwindows();
};
但我不喜欢这种方法。我更喜欢在单独的文件(h和cpp)中定义它们。
对于条件编译测试,最好使用_WIN32
而不是_WINDOWS_
。仅当包含windows.h
时才定义_WINDOWS_
,而编译器会为Windows目标的任何构建自动定义_WIN32
,而不管包含什么标头。在您的情况下,_WINDOWS_
是在编译main.cpp
时定义的,但在编译test.cpp
时没有定义,因为test.cpp
不包括windows.h
。
此外,_WINDOWS_
宏定义是windows.h
报头的实现细节,并且不保证被使用。例如,windows.h
的MinGW版本没有定义_WINDOWS_
。
您需要在test.cpp文件中包含windows.h
编译test.cpp时,它没有定义_WINDOWS_
符号。因此,它创建了一个没有windows函数的对象文件。
然后在test.hpp中,它使用了这个符号,因为您在main.cpp中包含了windows.h如果您更改includes的顺序,它的行为将有所不同。您应该重新思考如何选择不依赖于includes顺序的windows版本(例如,请参阅关于_WIN32_
的其他答案)。
您不能使用另一个代码文件(main.cpp)中的一些定义来更改已编译的对象文件(test.cpp)中的代码
- 我不断收到 [错误] ID 返回 1 退出状态错误,但看不到问题所在
- 看不到文件'SDL2.lib'
- WSL 看不到环境变量
- 为什么我的 FreeRTOS 任务看不到类成员?
- Google Colab 看不到 .so 文件
- 派生类看不到基类成员
- 为什么我看不到字符串?
- CMake 看不到SDL2_PATH环境变量 (Windows)
- OpenMP 任务看不到共享变量的更改
- handleMessage看不到我的类和函数
- 为什么 connect() 函数看不到插槽?
- 模板类看不到继承的模板成员
- 为什么即使链接器找到目标文件,我的程序也看不到函数定义?
- 将 somedialog.h 包含在项目的其他部分中会使编译器看不到 ui_somedialog.h
- SFML - 代码::块看不到 sfml 图形(等)文件
- CMake 看不到源文件,找不到 #includes
- ifstream在OSX上看不到新内容
- C++概念看到我的类型的函数,但看不到 std::vector 的函数
- unique_ptr看不到派生类的自定义构造函数
- 编译时符号被#定义,但#ifdef看不到它