MinGW-w64 编译失败,出现 nullptr_t
Posted
技术标签:
【中文标题】MinGW-w64 编译失败,出现 nullptr_t【英文标题】:MinGW-w64 compilation fails with nullptr_t 【发布时间】:2019-12-04 18:47:19 【问题描述】:我正在尝试使用 MinGHW-w64 编译 cpputest,但它失败了,因为它找不到 nullptr_t。失败的函数是 cputest\src\CppUTest\SimpleString.cpp:StringFrom
SimpleString StringFrom(const nullptr_t value)
(void) value;
return "(null)";
我尝试手动编译这个文件
C:\mingw-w64\i686-8.1.0-posix-dwarf-rt_v6-rev0\mingw32\bin\g++.exe -DCPPUTEST_HAVE_STRDUP=1 -DHAVE_CONFIG_H -D_TIMESPEC_DEFINED=1 @CMakeFiles/CppUTest.dir/includes_CXX.rsp -include "C:/git/tdd/cpputest/include/CppUTest/MemoryLeakDetectorNewMacros.h" -include "C:/git/tdd/cpputest/include/CppUTest/MemoryLeakDetectorMallocMacros.h" -std=c++11 -Wall -Wextra -pedantic -Wshadow -Wswitch-default -Wswitch-enum -Wconversion -Wsign-conversion -Wno-padded -Wno-long-long -Woverloaded-virtual -Wno-old-style-cast -Wno-c++14-compat -O2 -g -DNDEBUG -o CMakeFiles\CppUTest.dir\SimpleString.cpp.obj -c C:\git\tdd\cpputest\src\CppUTest\SimpleString.cpp
失败了
C:\git\tdd\cpputest\src\CppUTest\SimpleString.cpp:565:31: error: 'nullptr_t' does not name a type
SimpleString StringFrom(const nullptr_t value)
^~~~~~~~~
C:\git\tdd\cpputest\src\CppUTest\SimpleString.cpp:565:31: note: 'nullptr_t' is defined in header '<cstddef>'; did you forget to '#include <cstddef>'?
C:\git\tdd\cpputest\src\CppUTest\SimpleString.cpp:32:1:
+#include <cstddef>
C:\git\tdd\cpputest\src\CppUTest\SimpleString.cpp:565:31:
SimpleString StringFrom(const nullptr_t value)
^~~~~~~~~
C:\git\tdd\cpputest\src\CppUTest\SimpleString.cpp:565:14: error: redefinition of 'SimpleString StringFrom(int)'
SimpleString StringFrom(const nullptr_t value)
^~~~~~~~~~
C:\git\tdd\cpputest\src\CppUTest\SimpleString.cpp:479:14: note: 'SimpleString StringFrom(int)' previously defined here
SimpleString StringFrom(int value)
^~~~~~~~~~
C:\git\tdd\cpputest\src\CppUTest\SimpleString.cpp: In function 'SimpleString StringFrom(cpputest_longlong)':
C:\git\tdd\cpputest\src\CppUTest\SimpleString.cpp:576:29: warning: unknown conversion type character 'l' in format [-Wformat=]
return StringFromFormat("%lld", value);
^~~~~~
C:\git\tdd\cpputest\src\CppUTest\SimpleString.cpp:576:29: warning: too many arguments for format [-Wformat-extra-args]
C:\git\tdd\cpputest\src\CppUTest\SimpleString.cpp: In function 'SimpleString StringFrom(cpputest_ulonglong)':
C:\git\tdd\cpputest\src\CppUTest\SimpleString.cpp:581:29: warning: unknown conversion type character 'l' in format [-Wformat=]
return StringFromFormat("%llu", value);
^~~~~~
C:\git\tdd\cpputest\src\CppUTest\SimpleString.cpp:581:29: warning: too many arguments for format [-Wformat-extra-args]
C:\git\tdd\cpputest\src\CppUTest\SimpleString.cpp: In function 'SimpleString HexStringFrom(cpputest_longlong)':
C:\git\tdd\cpputest\src\CppUTest\SimpleString.cpp:586:29: warning: unknown conversion type character 'l' in format [-Wformat=]
return StringFromFormat("%llx", value);
^~~~~~
C:\git\tdd\cpputest\src\CppUTest\SimpleString.cpp:586:29: warning: too many arguments for format [-Wformat-extra-args]
C:\git\tdd\cpputest\src\CppUTest\SimpleString.cpp: In function 'SimpleString HexStringFrom(cpputest_ulonglong)':
C:\git\tdd\cpputest\src\CppUTest\SimpleString.cpp:591:29: warning: unknown conversion type character 'l' in format [-Wformat=]
return StringFromFormat("%llx", value);
^~~~~~
C:\git\tdd\cpputest\src\CppUTest\SimpleString.cpp:591:29: warning: too many arguments for format [-Wformat-extra-args]
我尝试了包含 cstddef 的幼稚解决方案:
#include <cstddef>
SimpleString StringFrom(const nullptr_t value)
(void) value;
return "(null)";
但是失败并出现同样的错误:
C:\git\tdd\cpputest\src\CppUTest\SimpleString.cpp:568:31: error: 'nullptr_t' does not name a type
SimpleString StringFrom(const nullptr_t value)
这个错误没有任何意义,因为我包含了 cstddef。
这个问题与this question有关。
感谢任何帮助!
【问题讨论】:
您确定该文件包含<cstddef>
?如果您将minimal reproducible example 设为#include <cstddef> void foo(nullptr_t) int main() foo(nullptr);
,是否会编译?
编辑了问题。是的,我很积极。除非我产生幻觉并且 #include <cstddef>
没有做我认为的那样。
最小示例是否可以编译,或者您是否也会收到错误?
啊,是的。 nullptr_t
不能保证在 std::
之外。您可以在文件顶部添加using std::nullptr_t
来解决此问题。
或者你可以像使用其他所有标准类型一样使用std::nullptr_t
...
【参考方案1】:
修复很简单:
SimpleString StringFrom(const std::nullptr_t value)
(void) value;
return "(null)";
感谢 NathanOliver-Reinstate Monica 帮助解决这个问题。
【讨论】:
以上是关于MinGW-w64 编译失败,出现 nullptr_t的主要内容,如果未能解决你的问题,请参考以下文章