草庐IT

c++ - 在这种情况下,为什么 g++ 和 clang 会破坏 namespace 抽象?

编译:structstr{};namespacea{voidfoo(strs){}}namespaceb{voidfoo(strs){}voidbar(strs){foo(s);}}intmain(int,char**){return0;}但这不是(将结构定义移到命名空间a内)namespacea{structstr{};voidfoo(strs){}}namespaceb{voidfoo(a::strs){}voidbar(a::strs){foo(s);}}intmain(int,char**){return0;}我得到的错误是bad.cpp:Infunction‘voidb::b

c++ - 如何在 clang(或 gcc)中删除 C++ 名称?

我正在尝试为clang编写一个快速而肮脏的demangler。我找到了pieceofcode它使用abi::__cxa_demangle,但我不知道它需要哪个header。显而易见的选择是ABI.h但是:demangle.cpp:2:10:fatalerror:'ABI.h'filenotfound#include^使用abi::__cxa_demangle需要什么? 最佳答案 包括cxxabi.h。在Ubuntu13中,此header位于/usr/include/c++/4.x中,其中x是次要gcc版本。

c++ - 在 ubuntu 12.04 上设置 Xerces 以与 cmake 和 clang 一起使用

我想在我的项目中使用Xerces,我在cmake和clang的帮助下编译了它。我所做的是:下载源将其解压缩到名为“xerces-c-3.1.1”的文件夹cd进入那个文件夹./configuremakemakeinstall然后我写了LINK_DIRECTORIES(/usr/local/lib)进入我的CMakeLists.txt和#include进入我的main.cpp。它编译正常,但链接不起作用。我得到以下结果:LinkingCXXexecutableDG5_RECMakeFiles/DG5_RE.dir/main.cpp.o:Infunction`xercesc_3_1::XML

c++ - 在 constexpr 中使用 strcmp 的编译器差异

以下在GCC中编译但不在Clang中编译:#includeconstexprinttest=strcmp("test","test");所以我的问题是,GCC如何以不同方式处理strcmp以使其成为可能?strcmp是某种类型的内置函数,还是它的标准库具有包含constexpr的strcmp的非标准定义? 最佳答案 代码在gcc上编译,因为它提供了一个built-inversion在编译时评估的strcmp,假设您将字符串文字传递给函数。gcc将rejectthecode如果您传递-fno-builtin(或-fno-builtin

c++ - 重载内置(固有?)功能

考虑以下代码:#include#includedoublelog(double){return42;}intmain(){std::cout在构建调试版本时,所有使用的编译器(msvc、gcc、clang)都会打印42。但是当我尝试在Release模式下构建(并运行)时,我得到:msvc中的编译错误:错误C2169:“log”:内部函数,无法定义;为gcc打印42;为clang打印0。为什么同一编译器的发布/调试结果不同?为什么不同的编译器在Release模式下得到不同的结果? 最佳答案 您正在定义一个已在中声明的函数与外部链接。C

c++ - 使用默认初始化的 Clang 编译错误

这个问题在这里已经有了答案:DoIreallyneedtoimplementuser-providedconstructorforconstobjects?(4个答案)关闭7年前。考虑以下示例:#include#includestructA{//A()=default;//doesneithercompilewith,norwithoutthisline//A(){};//doescompilewiththislineintsomeVal{123};voidfoobar(int){};};intmain(){constAa;std::cout::valueSeeLiveexample这

c++ - static_casting a constexpr void* 的结果是常量表达式吗?

clang正在拒绝gcc允许的这段代码:intmain(){staticconstexprconstvoid*vp=nullptr;staticconstexprconstchar*cp=static_cast(vp);}具有以下内容:error:constexprvariable'cp'mustbeinitializedbyaconstantexpressionstaticconstexprconstchar*cp=static_cast(vp);阅读完N3797中的最终list后5.9/2我没有看到任何禁止在常量表达式中使用static_cast的内容。我是在看错地方还是误读了什么

c++ - sscanf 中 uint16_t 的正确且可移植的 (Clang/GCC) 修饰符是什么?

当我尝试编译这段代码时收到一条警告消息sscanf(value,"%h"PRIu16"B",&packet_size)使用Clang600.0.57(OSX)。warning:formatspecifiestype'unsignedchar*'buttheargumenthastype'uint16_t*'(aka'unsignedshort*')[-Wformat]if(sscanf(value,"%h"PRIu16"B",&packet_size)==1){~~~~^~~~~~~~~~~~但是如果我删除修饰符“h”,那么我会在GCC4.8.3(ScientificLinux7)中收

c++ - enable_if 的句法模式

我一直以这种近似的方式对各种版本的GCC(最高5.2)使用enable_if:template...>voidfn(){std::cout...>voidfn(){std::cout();fn();但是,事实证明,Clang3.7不接受这一点(“对‘fn’的调用不明确”)。Q1。谁是对的,为什么?当然还有其他方法可以做到,但我有点不喜欢templatestd::enable_if_tfa(){std::cout及其类似的方法使函数签名的正常部分更难阅读,并且template=0>voidfd(){std::cout用于涉及不相关的元素(类型和值)。Q2。还有哪些其他(正确、更易读、更少

c++ - 为什么下面的代码不能用 gcc 编译但用 clang 编译得很好

下面的代码可以用clang编译,但不能用gcc编译,请问这是gcc中的错误吗?它只是一个包含unique_ptrvector和std::function作为成员的类,当我创建此类的vector时,我不能对此说保留或调整大小。push_back与std::move一起工作正常,而这只发生在gcc而不是clang上。#include#include#include#include#include#includeusingnamespacestd;classABC{public:ABC(){}private:std::vector>up;std::functionfunc;};intmain