使用Eclipse IDE。问题是#defines
没有从标题传递到c和h文件。不知道这是项目设置还是什么项目,但是Visual Studio IDE在同一项目上没有给我带来任何麻烦。 Eclipse中的某些项目虽然没有这个问题。有什么想法可能有问题吗?请参阅下面的问题示例。
即使header1.h
中定义了EXAMPLE,也无法将其识别为main.c
中的定义。编译器也没有发现头文件的问题。谢谢大家的帮助。
Header1.h
#define EXAMPLE 1
main.c
#include "Header1.h"
#if defined(EXAMPLE)
/* code here */
#endif
您提到编译器和Visual Studio没问题,因此假设您所指的是在Eclipse IDE中变灰的代码?如果是这样,请检查索引器设置
首选项-> C / C ++->索引器
检查启用索引器检查索引源文件未包含在 构建检查自动更新索引检查使用活动构建 配置
等,...
希望这与您的问题有关。
这项工作吗?
#ifdef EXAMPLE
代替
#if defined(EXAMPLE)
[使用字符串而不是整数的#define
时,可以看到与问题类似的行为。
以下代码似乎仅在Code();
等于字符串MODE
时才应运行different
:
mode.h
#define MODE something
different.cpp
#include "mode.h"
#if MODE == different
Code();
#endif
Eclipse在显示Code();
时将其显示为不活动状态。这样做的原因是预处理器不支持字符串比较,仅支持整数1。
在MODE
中将鼠标悬停在different.cpp
上时,MODE
显示为具有值something
。尽管从技术上讲这是正确的,但由于MODE
和something
都评估为同一事物(已定义但为空的值),因此可能会产生误导。假设它们都具有相同的值(无),则它们被视为相等,并且运行Code();
。
1这在this question中有更详细的介绍。
解决方案
想到这两种可能的正确处理方法:
#define
使用数值
该代码可以编写如下:
mode.h
#define MODE_something 0
#define MODE_different 1
#define MODE MODE_something
different.cpp
#include "mode.h"
#if MODE == MODE_different
Code();
#endif
在这种情况下,代码将按预期工作,因为MODE
和MODE_different
评估为两个不同的值(分别为0
和1
)。
使用唯一的#define
s
另一种方法是为每个选项使用唯一命名的宏。例如:
mode.h
// Select the active mode:
#define MODE_something
//#define MODE_different
different.cpp
#include "mode.h"
#ifdef MODE_different
Code();
#endif