我正在开发一个基于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(,宏没有定义在语法检查期间,我们回到原点。