【问题标题】:Eclipse and C based issue: #defines aren't working outside of header files基于 Eclipse 和 C 的问题:#defines 在头文件之外不起作用
【发布时间】:2011-11-09 03:59:05
【问题描述】:

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


【解决方案1】:

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

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

检查启用索引器检查索引源文件未包含在 build Check 自动更新索引 Check Use Active build 配置

等等……

希望这与您的问题有关。

【讨论】:

    【解决方案2】:

    这行得通吗?

    #ifdef EXAMPLE
    

    而不是

    #if defined(EXAMPLE)
    

    【讨论】:

      【解决方案3】:

      当使用#defines 是字符串而不是整数时,可以看到类似于问题中的行为。

      下面的代码似乎只有在MODE 等于字符串different 时才应该运行Code();

      mode.h

      #define MODE something
      

      不同的.cpp

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

      Code(); 看起来应该处于非活动状态时,Eclipse 将其显示为处于活动状态。原因是预处理器不支持字符串比较,只支持整数比较1.

      将鼠标悬停在different.cpp 中的MODE 上时,MODE 显示为具有值something。尽管这在技术上是正确的,但它可能会产生误导,因为 MODEsomething 都评估为相同的东西(一个已定义但为空的值)。鉴于它们都具有相同的值(无),它们评估为相等并且运行 Code();

      1这在this question中有更详细的介绍。


      解决方案

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

      • 为每个选项分配数值
      • 为每个选项使用唯一的#defines

      使用数值

      代码可以写成如下:

      mode.h

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

      不同的.cpp

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

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

      使用唯一的#defines

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

      mode.h

      // Select the active mode:
      
      #define MODE_something
      //#define MODE_different
      

      不同的.cpp

      #include "mode.h"
      
      #ifdef MODE_different
      
      Code();
      
      #endif
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-23
        • 1970-01-01
        • 1970-01-01
        • 2022-10-12
        相关资源
        最近更新 更多