我如何说服Eclipse CDT为源代码编辑和代码完成定义了一个宏?

时间:2013-08-13 17:36:21

标签: eclipse eclipse-cdt eclipse-juno

我的源代码中有:

// 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宏,以便源代码编辑器知道它并完成代码?

4 个答案:

答案 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 中的构建和索引)

这是我的首选方式。

在此示例中,我们将在 Eclipse 项目级别设置以下定义(用于其索引器和构建器),而不是在您的源代码中。

#define ARDUINO 1000
#define AVR
#define __AVR_ATmega328__

如果您在手动构建 gccg++ 项目时在命令行定义它们,则上述 #define 将如下所示(搜索 -Dmacroman gcc 页了解详情):

-DARDUINO=1000 -DAVR -D__AVR_ATmega328__

因此,在您的 Eclipse 项目中执行以下操作。我的项目在这里称为“Arduino 1.8.13”(请参阅​​下面几张图片的完整屏幕截图):

在左侧的“项目资源管理器”窗格中右键单击您的项目 --> 属性 --> C/C++ 常规 > --> 路径和符号 --> 符号选项卡 --> 选择 GNU CGNU C++ --> 点击右上角的添加按钮 --> 输入 ARDUINO 作为 name1000 作为 value --> 请务必检查添加到所有配置添加到所有语言的 2 个框(除非您不想要这些行为)--> 单击好的
enter image description here

对所有定义重复此步骤,如下所示。请务必选中每个选项的添加到所有配置添加到所有语言(除非您不想要这些行为)的复选框:

  1. 名称:ARDUINO,值:1000
  2. 名称:AVR,值:(留空)
  3. 名称:__AVR_ATmega328__,值:(留空)

这是显示第一个的屏幕截图。请注意要单击或注意的所有突出显示部分:

enter image description here

为所有要定义的宏(例如:上面的 3 个)完成此操作后,您将看到以下内容:

  1. 如果您为每一种都选中了添加到所有语言框,那么这些宏将同时应用于 GNU CGNU C++< /strong> 语言。因此,单击一个,然后单击另一个,您应该会在两个位置看到宏,如下所示: enter image description here
  2. 如果您为每个配置选中添加到所有配置框,那么这些宏也将应用于所有构建“配置”,例如调试发布,如下所示: enter image description here
  3. 请记住,“语言”和“配置”的所有各种组合都是独一无二的。如果您在添加宏时未选中 添加到所有配置添加到所有语言 的 2 个框,您可以为每个配置分别为一种或两种语言设置宏.
  4. 如果您导航到项目属性 --> C/C++ Build --> 设置 --> 工具设置< /strong> 选项卡 --> Cross GCC 编译器 --> 预处理器 在构建或索引时,您还将看到现在为所有“GCC”C 文件定义的这些宏!: enter image description here
    请注意,您还可以在此处编辑、添加或删除特定于给定“配置”或“语言”(此特定位置适用于 GNU C 语言)的宏,而不是像之前那样做, 如果你喜欢。 但是,将给定的宏同时应用于所有语言和所有构建配置的唯一方法是按照我上面向您展示的方式进行操作。
  5. 如果您导航到 Project Properties --> C/C++ Build<,您还可以看到这些宏应用于 GNU C++ 构建和索引设置/strong> --> 设置 --> 工具设置选项卡 --> 跨 G++ 编译器 --> 预处理器enter image description here
    同样,要仅为 C++ 和仅为此选定的“配置”自定义宏,您可以在此处编辑它们。

添加完所有宏后,点击应用应用并关闭。当系统询问时,选择以重新索引整个项目:
enter image description here

如果您没有点击,您可以通过在项目资源管理器中右键单击它并转到-->来手动触发重新索引项目索引 --> 重建

问题排查

如果您的设置/宏似乎没有得到应用,并且您的代码仍然显示部分被涂黑,表明这些部分的宏是错误的或未定义的,您可能需要执行或检查以下内容:

  1. 尝试通过在项目浏览器中右键单击项目并转到 --> 索引 --> 重建来重新索引您的项目。
  2. 您可能没有为正确的构建配置或语言设置宏。正如我在上面的各种屏幕截图中所示,您需要检查所有各种构建配置和语言。
    1. 按照上述说明重新添加宏,这次一定要检查添加到所有配置添加到所有语言的 2 个框。立>
    2. 或者,手动导航到项目属性 --> C/C++ Build --> 设置 --> 工具设置标签 -->
      1. --> Cross GCC 编译器 --> 预处理器 OR
      2. --> 交叉 G++ 编译器 --> 预处理器...
    • ...部分手动配置宏,仅用于一种语言和/或配置,或另一种。所有这些设置必须同步或单独设置。
  3. 如上所述,最容易设置这些设置的地方是:右键单击您的项目,在左侧的“项目资源管理器”窗格中 --> 属性< /strong> --> C/C++ 常规 --> 路径和符号 --> 符号选项卡。但是,如果您忘记选中添加到所有配置添加到所有语言的框,我建议您删除宏然后再次添加它们,这次检查这些盒子。
  4. 如果您不想担心您选择了哪个构建配置,并且您在添加宏时没有选中添加到所有配置框,您也可以更改此全局工作区设置,但我真的不推荐它:
    窗口 --> 首选项 --> C/C++ --> 索引器 --> 选择使用活动构建配置。但是,我自己也不使用此选项,也不一定建议您使用它。这只是需要注意的事情。
    enter image description here

另见

  1. 这个答案也发布在我的网站上:https://gabrielstaples.com/eclipse-defining-custom-macros-for-indexer/
  2. 我的完整 Eclipse 设置文档在这里:https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles/tree/master/eclipse