CLion无法解析所有宏

时间:2018-05-24 19:03:22

标签: c c-preprocessor clion

我有5个文件(+ makefile):

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

conf.h通过makefile间接包含conf.h

问题是CLion可以解析#if中定义的宏(通过转到声明),但它不会将它们视为突出显示。这意味着具有hello_world.c的部分始终会折叠并突出显示为注释。您可以在makefile

中看到该行为

是否可以以考虑此类声明的方式配置CLion,或至少禁用折叠和评论' -highlightning? 请记住,不可能摆脱PreferenceFragment,因为它是一个复杂设置的庞大项目。 (original source

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

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

1 个答案:

答案 0 :(得分: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的代码突出显示机制无法识别来自命名文件的任何声明(特别是宏定义),通过Makefile,PROJECT_CONF_H

  

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

     

是否可以以其认为的方式配置CLion   声明或至少禁用折叠和   &#39;评价&#39;?-highlightning

尽管很可能CLion可以配置为禁用由预处理器条件抑制的折叠代码段,但很难将这个问题归咎于CLion。很可能它只分析你的源文件,而不是你的Makefile,所以就它而言,你的配置标题确实从未包括在内。它知道标题是那里,所以其中的符号在其索引中,但那就是它。

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

  

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

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