C2440编译错误:__cplusplus编译选项引发的

简介: C2440编译错误:__cplusplus编译选项引发的
  • error C2440: “=”: 无法从“_Ty”转换为“T”


// qhashfunctions.h
// like std::exchange
template <typename T, typename U = T>
Q_DECL_RELAXED_CONSTEXPR T qExchange(T &t, U &&newValue)
{
    T old = std::move(t);
    t = std::forward<U>(newValue); // here
    return old;
}


  • error C2440: “reinterpret_cast”: 无法从“int”转换为“quintptr”


// qglobal.h
Q_DECL_CONST_FUNCTION inline uint qHash(std::nullptr_t, uint seed = 0) noexcept
{
    return qHash(reinterpret_cast<quintptr>(nullptr), seed);// here
}


排查了好久,提示无法从int转换为qunitptr,可是nullptr怎么是int呢?


最终发现httpglobal.h发现有重定义nullptr,问题就出在这个为什么导致重定义上?


image.png


问题就出在这个__cplusplus上,查阅资料发现,这个是vs的历史遗留问题,增加编译选项/Zc:__cplusplus即可


image.png


CMake中增加编译选项:


if(MSVC)
    target_compile_options(${APP_NAME} PUBLIC "/Zc:__cplusplus")
endif()
目录
相关文章
|
8月前
|
编译器 Linux 开发工具
|
2天前
|
存储 编译器 C语言
深入理解GCC 和 G++ 编译器
GCC 和 G++ 是 GNU 工具链中的核心编译器,支持 C 和 C++ 程序开发。本文详细介绍其编译流程、常用选项及动态链接与静态链接的区别。编译过程分为预处理、编译、汇编和链接四个阶段,每个阶段有特定任务和命令选项。常用选项如 `-E`、`-S`、`-c` 和 `-o` 分别用于预处理、生成汇编代码、生成目标文件和指定输出文件。动态链接节省空间且易于更新,但依赖运行时库;静态链接独立高效,但文件较大且更新困难。合理选择优化选项(如 `-O0` 至 `-O3`)可提升程序性能。掌握这些知识有助于开发者更高效地编写、调试和优化代码。
38 23
深入理解GCC 和 G++ 编译器
|
5月前
|
自然语言处理 编译器 C语言
C语言程序的编译
C语言程序的编译
82 2
|
7月前
|
自然语言处理 Ubuntu 编译器
|
8月前
|
Java 编译器 程序员
我们竟然都中了编译器施的“迷魂药“
相信在座各位都中过编译器施的”迷魂药”,表面你以为你写的程序按你的意志在顺序执行着,看了看程序执行结果,没错确实是自己期望的结果。偷偷告诉你,这都是编译器给你造成的幻觉。编译器可不会告诉你,他为了提高你写的程序性能,下了多少功夫。编译器:下点迷魂药不过分吧?
|
7月前
我为什么更推荐你使用cmake编译grpc程序?
我为什么更推荐你使用cmake编译grpc程序?
152 0
|
编译器 C语言 C++
Makefile中常见的gcc编译参数
Makefile中常见的gcc编译参数
428 0
|
自然语言处理 编译器
【译】一个超级小的编译器
【译】一个超级小的编译器
89 0
C++编译提示宏重定义了,怎么办?
C++编译提示宏重定义了,怎么办?
972 0
|
C++ 编译器
C++ 编译器
C++编译器 当我们定义了一个类的时候, C++编译器在默认的情况下会为我们添加默认的构造方法, 拷贝构造方法, 析构函数和=运算符 在第一次创建对象的语句中如: MyString myString = "hello, world!";中, 如果我们定义的构造函数为如下, 则就是隐式调用构造方法,...
1773 0