基于Eclipse和C的问题:#定义不在头文件之外

问题描述 投票:1回答:3

使用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
c eclipse ide c-preprocessor
3个回答
0
投票

您提到编译器和Visual Studio没问题,因此假设您所指的是在Eclipse IDE中变灰的代码?如果是这样,请检查索引器设置

首选项-> C / C ++->索引器

检查启用索引器检查索引源文件未包含在 构建检查自动更新索引检查使用活动构建 配置

等,...

希望这与您的问题有关。


0
投票

这项工作吗?

#ifdef EXAMPLE

代替

#if defined(EXAMPLE)

0
投票

[使用字符串而不是整数的#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。尽管从技术上讲这是正确的,但由于MODEsomething都评估为同一事物(已定义但为空的值),因此可能会产生误导。假设它们都具有相同的值(无),则它们被视为相等,并且运行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

在这种情况下,代码将按预期工作,因为MODEMODE_different评估为两个不同的值(分别为01)。

使用唯一的#define s

另一种方法是为每个选项使用唯一命名的宏。例如:

mode.h

// Select the active mode:

#define MODE_something
//#define MODE_different

different.cpp

#include "mode.h"

#ifdef MODE_different

Code();

#endif
© www.soinside.com 2019 - 2024. All rights reserved.