4

我的源代码中有:

// 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().

但是,在 Eclipse CDT 源代码编辑器中,我定义的部分foo::bar()具有灰色背景(建议foo::bar()不会包含在构建中),并且类型对象的代码完成foo不建议bar()作为可以调用的方法。

如何I_WANT_THIS_FEATURE使用自定义 makefile 在 Eclipse CDT makefile 项目中定义宏,以便源代码编辑器和代码完成知道它?

4

4 回答 4

5

除了奥斯瓦尔德的回答:

如果您有多个构建配置,Eclipse Indexer 的默认行为似乎是它始终使用第一个构建配置。

在我的情况下,定义仅在第 3 次构建配置中定义,因此 Oswald 提供的解决方案没有帮助。

要全局更改此设置,请选择Window -> Preferences -> C/C++ -> Indexer。选择使用活动构建配置

您还可以选择覆盖Project -> Properties -> C/C++ General -> Indexer下项目设置中的全局设置,然后选择Enable project specific settings,然后选择Use active build configuration

在此之后,奥斯瓦尔德提供的解决方案应该可以工作:

项目 -> 属性 -> C/C++ 常规 -> 路径和符号

选择 Symbols 选项卡并添加...一个名为 I_WANT_THIS_FEATURE 且值为 1 的新符号。

于 2016-11-16T15:29:26.180 回答
3

找到它:项目->属性-> C/C++ 常规->路径和符号

选择符号选项卡并添加...一个新符号,其名称 I_WANT_THIS_FEATURE值为1

于 2013-08-13T17:50:34.110 回答
0

几乎每个编译器都使用 -D 并仅提供像 -DI_WANT_THIS_FEATURE 这样的名称来定义值为 1 的符号 I_WANT_THIS_FEATURE。

eclipse 索引器/编辑器显然不知道这一点,所以:

#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 的问题。

于 2020-10-22T11:56:32.653 回答
0

Eclipse 让这变得相当混乱,因为有多个地方可以设置它,并且设置是耦合的,但它是这样工作的:

为给定项目设置自定义宏(影响 Eclipse 中的构建和索引)

这是我的首选方式。

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

#define ARDUINO 1000
#define AVR
#define __AVR_ATmega328__

如果您在手动构建gccg++项目时在命令行中定义它们,则上面#define的 s 将如下所示(-Dmacroman gcc页面中搜索以获取详细信息):

-DARDUINO=1000 -DAVR -D__AVR_ATmega328__

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

在左侧的“项目资源管理器”窗格中右键单击您的项目-->属性--> C/C++ 常规-->路径和符号-->符号选项卡 --> 选择GNU CGNU C++ -- > 单击右上角的添加按钮 --> 输入ARDUINO名称--1000 >确保选中 2 个框以添加到所有配置添加到所有语言(除非您不想要这些行为)- -> 单击确定
在此处输入图像描述

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

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

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

在此处输入图像描述

一旦你为你想要定义的所有宏(例如:上面的 3 个)完成了这个,你将看到以下内容:

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

添加完所有宏后,单击ApplyApply and Close。询问时,选择YES以重新索引整个项目:
在此处输入图像描述

如果您没有单击YES ,您可以通过在 Project Explorer 中右键单击该项目并转到 --> Index --> Rebuild手动触发重新索引项目。

故障排除

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

  1. 尝试通过在 Project Explorer 中右键单击项目并转到 --> Index --> Rebuild来重新索引您的项目。
  2. 您可能没有为正确的构建配置或语言设置宏。正如我在上面的各种屏幕截图中所示,您将需要检查所有各种构建配置和语言。
    1. 按照上面的说明重新添加宏,这次一定要选中Add to all configurationAdd to all languages的 2 个框。
    2. 或者,手动导航到项目属性--> C/C++ 构建-->设置-->工具设置选项卡 -->
      1. -->跨 GCC 编译器-->预处理器
      2. -->跨 G++ 编译器-->预处理器...
    • ...部分为一种语言和/或配置或另一种手动配置宏。所有这些设置必须同步或单独设置。
  3. 如上所述,设置这些设置最简单的地方是:在左侧的“项目资源管理器”窗格中右键单击您的项目-->属性--> C/C++ 常规-->路径和符号- ->符号选项卡。但是,如果您忘记选中Add to all configurationsAdd to all language复选框,我建议您删除宏然后再次添加它们,这次选中这些复选框。
  4. 如果您不想担心选择了哪个构建配置,并且在添加宏时没有选中添加到所有配置框,您也可以更改此全局工作区设置,但我真的不推荐它:
    Window --> Preferences --> C/C++ --> Indexer --> 选择Use active build configuration。但是,我自己也不使用此选项,也不一定建议您使用它。这只是需要注意的事情。
    在此处输入图像描述

也可以看看

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