仅在QtCreator代码模型中设置预处理器符号



我正在开发一个基于CMake的项目,该项目同时包含C++和CUDA源文件,并且具有两种语言都包含的一些头文件。

对于这些头文件,我希望看到高亮显示和语法检查的结果尽可能接近CUDA编译器NVCC的结果,因此,例如,我希望定义预处理器符号__CUDACC__

CMake没有定义这样的符号,这对我来说很重要,因为它实际上是NVCC工具链的内部符号,我纯粹出于语法检查的目的需要它。

我试过";工具->C++->附加的预处理器指令";而且似乎没有任何效果。我还尝试了一个名为CMakeLists.txt.config的文件,它似乎也没有效果。

我很乐意给你一个建议。重申一下,我正在寻找一种方法来设置只对语法检查系统可见的define(CPP符号/宏(。

我刚刚发现了这篇文章,它揭示了我最初问题的正确答案。事实证明,在语法检查过程中,QtCreator定义了Q_CREATOR_RUN宏。

所以一切都需要它检查它的定义:

#if defined(Q_CREATOR_RUN) || defined(__INTELLISENSE__)
#  define IN_SYNTAX_CHECKER 1
#else
#  define IN_SYNTAX_CHECKER 0
#endif

在上面的示例中,我还检查是否定义了__INTELLISENSE__,以便在Visual Studio和VS Code中也可以使用相同的逻辑。


[出于考古学原因保留-以上答案更好]

在进一步挖掘之后,我发现了Clang分析器特有的一个属性,该属性是在为语法检查而执行的分析过程中定义的,而不是在编译过程中。

请注意,这纯粹是因为我的项目使用GCC编译,而QTCreator的语法检查则通过Clang运行。

// GCC and NVCC don't have __has_feature(), so we provide a fallback
#ifndef __has_feature 
#  define __has_feature(x) 0
#endif
#if __has_feature(attribute_analyzer_noreturn)
#  define IN_SYNTAX_CHECKER 1
#else
#  define IN_SYNTAX_CHECKER 0
#endif

这允许进行如下笨拙的破解,根据个人需要,可能有用,也可能无效。这个想法很像你让Clang观察您的代码,即使您使用GCC进行编译,也可以实现类似于与NVCC集成使用的文件。

#if IN_SYNTAX_CHECKER and !defined(__CUDACC__)
#  define __CUDACC__
#  include <cuda_device_runtime_api.h>
#  include <optix_device.h>
#endif

然而实质性问题仍然存在,当使用Clang进行编译时,上述所有内容都会面不改色,因为编译器clang++也定义了与enabled相同的功能。

要解决这个问题,需要在分析器中定义某种宏,但在Clang中没有,到目前为止,我还没有发现这样的宏。起初我希望CCD_ 6能够满足这种需求,但根据我的Qt Creator版本(6.0.2(,宏没有定义在语法检查期间,我们回到原点。

最新更新