我的源代码中有:
// foo.cpp
struct foo
{
foo() {}
#ifdef I_WANT_THIS_FEATURE
void bar() {}
#endif
};
在我的Makefile中我有
foo.o: foo.cpp
g++ -c -DI_WANT_THIS_FEATURE foo.cpp -o foo.o
这可以从命令行以及我在Eclipse中创建的外部构建器(基本上定义一些环境变量并调用make
)进行编译,我可以调用foo::bar()
。 / p>
但是,在Eclipse CDT源代码编辑器中,我定义foo::bar()
的部分具有灰色背景(表明foo::bar()
不会包含在构建中)和类型对象的代码完成foo
并不建议bar()
作为可以调用的方法。
如何使用自定义makefile在Eclipse CDT makefile项目中定义I_WANT_THIS_FEATURE
宏,以便源代码编辑器知道它并完成代码?
答案 0 :(得分:2)
除了奥斯瓦尔德的回答:
如果您有多个构建配置,Eclipse Indexer的默认行为似乎是它始终使用第一个构建配置。
在我的情况下,define仅在第3版构建配置中定义,因此Oswald提供的解决方案没有帮助。
要全局更改此选项,请选择窗口 - >偏好 - > C / C ++ - >索引即可。 选择使用有效的构建配置
您还可以选择覆盖项目 - >下项目设置中的全局设置。属性 - > C / C ++ - >索引器并选择启用项目特定设置,然后选择使用有效构建配置。
在此之后,Oswald提供的解决方案应该有效:
项目 - >属性 - > C / C ++一般 - >路径和符号
选择符号选项卡并添加...名称为I_WANT_THIS_FEATURE且值为1的新符号。
答案 1 :(得分:1)
找到它:项目 - > 属性 - > C / C ++一般 - > 路径和符号
选择符号标签,然后选择添加... 一个包含名称 I_WANT_THIS_FEATURE
的新标记和值< / strong> 1 。
答案 2 :(得分:0)
几乎所有编译器都使用-D并仅提供-DI_WANT_THIS_FEATURE之类的名称来定义符号I_WANT_THIS_FEATURE,其值为1。
日食索引器/编辑器显然不知道,所以:
#if I_WANT_THIS_FEATURE
this code is marked inactive in editor,
but will be seen by compiler and cause error
#endif
其中:
#ifdef I_WANT_THIS_FEATURE
this code is marked active in editor
#endif
因此,这确实是eclipse的问题,因为它不知道通过-D定义的符号的默认值为1。
答案 3 :(得分:0)
Eclipse 使这变得相当混乱,因为有多个地方可以设置它,并且设置是耦合的,但它的工作原理如下:
这是我的首选方式。
在此示例中,我们将在 Eclipse 项目级别设置以下定义(用于其索引器和构建器),而不是在您的源代码中。
#define ARDUINO 1000
#define AVR
#define __AVR_ATmega328__
如果您在手动构建 gcc
或 g++
项目时在命令行定义它们,则上述 #define
将如下所示(搜索 -Dmacro
在 man gcc
页了解详情):
-DARDUINO=1000 -DAVR -D__AVR_ATmega328__
因此,在您的 Eclipse 项目中执行以下操作。我的项目在这里称为“Arduino 1.8.13”(请参阅下面几张图片的完整屏幕截图):
在左侧的“项目资源管理器”窗格中右键单击您的项目 --> 属性 --> C/C++ 常规 > --> 路径和符号 --> 符号选项卡 --> 选择 GNU C 或 GNU C++ --> 点击右上角的添加按钮 --> 输入 ARDUINO
作为 name 和 1000
作为 value强> --> 请务必检查添加到所有配置和添加到所有语言的 2 个框(除非您不想要这些行为)--> 单击好的。
对所有定义重复此步骤,如下所示。请务必选中每个选项的添加到所有配置和添加到所有语言(除非您不想要这些行为)的复选框:
ARDUINO
,值:1000
AVR
,值:(留空)__AVR_ATmega328__
,值:(留空)这是显示第一个的屏幕截图。请注意要单击或注意的所有突出显示部分:
为所有要定义的宏(例如:上面的 3 个)完成此操作后,您将看到以下内容:
添加完所有宏后,点击应用或应用并关闭。当系统询问时,选择是以重新索引整个项目:
如果您没有点击是,您可以通过在项目资源管理器中右键单击它并转到-->来手动触发重新索引项目索引 --> 重建。
如果您的设置/宏似乎没有得到应用,并且您的代码仍然显示部分被涂黑,表明这些部分的宏是错误的或未定义的,您可能需要执行或检查以下内容:>