基于Eclipse和C的问题:#定义aren';t在头文件之外工作

基于Eclipse和C的问题:#定义aren';t在头文件之外工作,c,eclipse,ide,c-preprocessor,C,Eclipse,Ide,C Preprocessor,使用EclipseIDE。问题是#defines没有从头文件传递到c和h文件。不确定这是不是一个项目设置之类的东西,但是VisualStudioIDE在同一个项目上并没有给我带来任何麻烦。但是Eclipse中的一些项目没有这个问题。有什么想法可能是错误的吗?请参见下面的问题示例 即使示例是在header1.h中定义的,它也不会被识别为在main.c中定义的。编译器查找头也没有问题。谢谢大家的帮助 校长1.h #define EXAMPLE 1 main.c #include "Header1.

使用EclipseIDE。问题是
#defines
没有从头文件传递到c和h文件。不确定这是不是一个项目设置之类的东西,但是VisualStudioIDE在同一个项目上并没有给我带来任何麻烦。但是Eclipse中的一些项目没有这个问题。有什么想法可能是错误的吗?请参见下面的问题示例

即使示例是在
header1.h
中定义的,它也不会被识别为在
main.c
中定义的。编译器查找头也没有问题。谢谢大家的帮助

校长1.h

#define EXAMPLE 1
main.c

#include "Header1.h"

#if defined(EXAMPLE)

/* code here */

#endif

您提到编译器和VisualStudio没有问题,所以假设您所指的代码在EclipseIDE中是灰色的?如果是,请检查索引器设置

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

选中启用索引器检查索引中未包含的源文件 生成检查自动更新索引检查使用活动生成 配置

等等

希望这与您的问题相关。

这有效吗

#ifdef EXAMPLE
而不是

#if defined(EXAMPLE)

当使用
#定义
s(字符串而非整数)时,可以看到与问题中类似的行为

下面的代码似乎应该运行
code()仅当
模式
等于字符串
不同时

模式.h

#define MODE something
#define MODE_something 0
#define MODE_different 1

#define MODE MODE_something
// Select the active mode:

#define MODE_something
//#define MODE_different
不同的.cpp

#include "mode.h"

#if MODE == different
  Code();
#endif
#include "mode.h"

#if MODE == MODE_different
  Code();
#endif
#include "mode.h"

#ifdef MODE_different

Code();

#endif
Eclipse显示
code()显示为活动时应为非活动状态。原因是预处理器不支持字符串比较,只支持整数比较1

different.cpp
中的
模式
上滑动鼠标时,
模式
显示为具有值
某物
。虽然这在技术上是正确的,但它可能会产生误导,因为
模式
某物
的计算结果是相同的(定义但为空的值)。假设它们都有相同的值(没有),它们的计算结果是相等的,
code()正在运行

1这将在中详细介绍


解决方案

我想到了两种可能的正确处理方法:

  • 为每个选项指定数值
  • 使用唯一的
    #为每个选项定义
    s
使用数值

代码可以编写如下:

模式.h

#define MODE something
#define MODE_something 0
#define MODE_different 1

#define MODE MODE_something
// Select the active mode:

#define MODE_something
//#define MODE_different
不同的.cpp

#include "mode.h"

#if MODE == different
  Code();
#endif
#include "mode.h"

#if MODE == MODE_different
  Code();
#endif
#include "mode.h"

#ifdef MODE_different

Code();

#endif
在这种情况下,代码按预期工作,因为
模式
模式_不同
计算为两个不同的值(
0
1

使用唯一的
#定义
s

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

模式.h

#define MODE something
#define MODE_something 0
#define MODE_different 1

#define MODE MODE_something
// Select the active mode:

#define MODE_something
//#define MODE_different
不同的.cpp

#include "mode.h"

#if MODE == different
  Code();
#endif
#include "mode.h"

#if MODE == MODE_different
  Code();
#endif
#include "mode.h"

#ifdef MODE_different

Code();

#endif

这似乎是一个相当基本的功能,可能会出错;你能把你的问题简化成其他人可以轻易测试的东西吗?