使用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
答案 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
。尽管从技术上讲这是正确的,但由于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
另一种方法是为每个选项使用唯一命名的宏。例如:
mode.h
// Select the active mode:
#define MODE_something
//#define MODE_different
different.cpp
#include "mode.h"
#ifdef MODE_different
Code();
#endif