基于Eclipse和C的问题:#defines不在头文件之外工作

时间:2011-11-09 03:59:05

标签: c eclipse ide c-preprocessor

使用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

3 个答案:

答案 0 :(得分:0)

你提到编译器和visual studio没有问题,所以假设你指的是在Eclipse IDE中灰显的代码?如果是,请检查索引器设置

  

偏好设置 - > C / C ++ - >索引

     

选中启用索引器检查索引源文件中未包含的内容   构建检查自动更新索引检查使用活动构建   构造

等,...

希望这与您的问题相关。

答案 1 :(得分:0)

这有用吗?

#ifdef EXAMPLE

而不是

#if defined(EXAMPLE)

答案 2 :(得分: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

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

mode.h

// Select the active mode:

#define MODE_something
//#define MODE_different

different.cpp

#include "mode.h"

#ifdef MODE_different

Code();

#endif