【问题标题】:CLion doesn't resolve all macrosCLion 无法解析所有宏
【发布时间】:2018-05-27 03:51:17
【问题描述】:

我有 5 个文件(+ makefile):

  • hello_city.hhello_world.hhello_world.c:这些文件描述 在应用程序中使用的框架。它允许一些 根据应用程序的需要进行配置。在文件中,#if#endif 用于选择加入和退出与某些选项相对应的源代码。
  • main.c:代表应用程序
  • conf.h:定义配置标志。

conf.h 通过makefile 间接包含。

问题在于 CLion 可以解析 conf.h 中定义的宏(通过 go to 声明),但它不考虑将它们突出显示。这意味着带有#if 的部分总是折叠并突出显示为 cmets。您可以在 hello_world.c 中看到这种行为。

是否可以以考虑此类声明的方式配置 CLion,或者至少禁用折叠和“注释”突出显示? 请记住,不可能摆脱makefile,因为它是一个具有复杂设置的大型项目。 (original source)

简化示例的源文件可以在这里找到:https://gist.github.com/Benedikt1992/05d01948ed1638e656b1dfbad244337c

更新:基本问题的简化和澄清

【问题讨论】:

  • 不,我们不会搜索您的大量源代码来尝试为您诊断此问题。但是,如果您提供 minimal reproducible example 来说明问题,那么我们将很乐意讨论其性质、可能的原因和可能的解决方案。
  • 我会试着想出一个更简单的例子
  • @JohnBollinger 包含最小、完整和可验证的示例

标签: c c-preprocessor clion


【解决方案1】:

如果你刚才这么说的话……

conf.h 是通过 makefile 间接包含的。

...首先,我们可能会节省很多时间。但是,为了澄清我在说什么,由于您忘记将您的 MCVE 直接放入问题中,这里的代码显示了您的意思:

hello_world.h

#ifndef SAMPLE_HELLO_WORLD_H
#define SAMPLE_HELLO_WORLD_H

/* PROJECT_CONF_H might be defined in the project Makefile */
#ifdef PROJECT_CONF_H
#include PROJECT_CONF_H
#endif /* PROJECT_CONF_H */

void hello_world();

#endif //SAMPLE_HELLO_WORLD_H

... 其中PROJECT_CONF_H 没有在源代码中的任何位置定义,而是通过 Makefile 中指定的编译器命令行选项定义。

不管怎样,你问:

问题在于 CLion 可以解析 conf.h 中定义的宏(通过 转到声明),但它不考虑将它们突出显示。

我认为您想说的是,在包含 hello_world.h 的文件中,CLion 的代码突出显示机制无法识别来自 PROJECT_CONF_H 通过 Makefile 命名的文件中的任何声明(尤其是宏定义)。

这意味着带有#if 的部分总是折叠并突出显示为 厘米。您可以在 hello_world.c 中看到这种行为。

是否可以以它认为这样的方式配置 CLion 声明或至少禁用折叠和 'comment'-高亮显示?

虽然很可能 CLion 可以配置为禁用被预处理器条件抑制的折叠代码部分,但很难将此问题归咎于 CLion。很可能它只分析您的源文件,而不是您的 Makefile,因此就它而言,您的配置标头确实从未包含在内。它知道标题在那里,所以其中的符号在它的索引中,但就是这样。

此时我观察到诸如 present 之类的代码结构是非常不寻常的。具体来说,通过头文件提供构建时配置数据的构建系统通常确保头始终存在,具有相同的名称,并通过在预构建配置中根据需要设置其 contents 来操作步骤(或要求一个人手动执行)。

请记住,这是不可能摆脱的 makefile 因为它是一个具有复杂设置的大型项目。

make 是一个了不起的工具。没有理由要转储 make 或 Makefile。但是你最好考虑改变它的这方面的工作方式。

【讨论】:

  • 感谢您的详细解答。虽然它不能直接解决“问题”,但它提供了对潜在问题的广泛理解以及如何处理它的提示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-23
  • 2017-11-13
  • 2019-06-25
  • 2019-09-05
  • 1970-01-01
相关资源
最近更新 更多