【问题标题】:Detect if c++11 is enabled in NVCC检测 NVCC 中是否启用了 c++11
【发布时间】:2019-12-20 09:14:32
【问题描述】:

我想检测 .cu 文件是否在启用 C++11 支持的情况下编译。目前我有以下内容:

#if CUDART_VERSION < 7050
  #define C11SUPPORTED 0
#else
  #define C11SUPPORTED 1
#endif

但这不起作用,因为即使支持 C++11,除非通过 -std=c++11 开关,否则不会启用它。当-std=c++11 被传递时,是否还有其他定义?

更新

nvcc --compiler-options -dM -E -x cu - &lt; /dev/null | grep "__cplus"

返回

#define __cplusplus 201402L

我使用的是 NVCC 版本 V9.1.85。检查__cplusplus 是否有效,即使对于旧的 NVCC 版本?

【问题讨论】:

    标签: c++11 cuda nvcc


    【解决方案1】:

    如果nvcc 符合标准,您应该可以像这样检查__cplusplus 的值

    #if __cplusplus >= 201103
    #define C11SUPPORTED 1
    #else
    #define C11SUPPORTED 0
    #endif
    

    检查__cplusplus 的值应该适用于任何 C++ 编译器,至少从C++98 开始。

    【讨论】:

    • 是的,我刚刚意识到我的编译器定义了__cplusplus(请参阅更新的问题)。我不确定这对于早期的 NVCC 版本有多强大。
    • 最早的 C++ 标准(即 C++98)已经定义了__cplusplus。事实上,它的使用时间要长得多,尽管该值可能不仅仅是 1,而是不同标准中指定的年月组合。
    • 哦,对了。我以为__cplusplus 只为 C++11 + 定义(我更新了我的问题)。我可以检查该值,而不是您在回答中建议的课程。不确定是否所有 nvcc 版本(在 CUDA 7.5 之后)都定义了 __cplusplus
    • 在 CUDA 8.0 上,如果我没有通过 -std=c++11 开关,我会得到 #define __cplusplus 199711L。如果我通过了,我会得到#define __cplusplus 201103L
    猜你喜欢
    • 1970-01-01
    • 2012-03-15
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-14
    • 2020-10-20
    相关资源
    最近更新 更多