草庐IT

C++ 预处理器未按预期处理定义

我在使用cpp预处理器时遇到问题。我有这样的Input.h文件:#ifndefPLATFORM_MOBILE1111#defineMyTestWEB111#endifintMyTest;我用这个命令处理它(在OSX上):cpp-E-PSource/Input.hGenerated/Output.h我明白了:#defineMyTestWEB111intMyTest;即宏MyTest未被应用。为什么?经过大量实验,我发现如果我在#ifndef行之后插入空行、变量定义、注释或任何其他行-那么它就可以正常工作。#ifndefPLATFORM_MOBILE1111#defineMyTestWEB

c++ - 如何在 clang::VarDecl 中获取变量名的位置

我正在使用clang3.0库对C/C++代码进行一些分析,我需要获取变量声明的位置,我试过这段代码:clang::VarDecl*vd=...;clang::SourceManager&srcMgr=...;clang::SourceRangeloc=vd->getSourceRange();clang::PresumedLoclocStart=srcMgr.getPresumedLoc(loc.getBegin());clang::PresumedLoclocEnd=srcMgr.getPresumedLoc(loc.getEnd());但是locStart和locEnd指向声明变量

c++ - 使用 CMake 查找使用 CLang 编译的 Boost

我已经使用rubenvb在Windows上编译了Boost1.51.0|的CLang构建。我实际上使用MinGW编译了b2:bootstrapmingw...compilingb2usingmingw...然后我用CLang编译了这些库:b2toolset=clangstage--stagedir=.--build-type=complete--with-regex...顺便说一句,即使我指定了--build-type=completelib目录中也没有DLL,但我在某处读到CLang在Windows上的链接仍然存在问题,所以这可能是原因。无论如何,静态库对我来说很好。我在%BOOST

c++ - 尽管包含 <typeinfo> ,但 Clang 拒绝 type_info 为不完整

我不明白为什么Clang会拒绝以下代码:#include#includeconstchar*get_name(conststd::exception_ptreptr){returneptr.__cxa_exception_type()->name();}intmain(){}GCC没问题,但是Clang提示type_info是一个不完整的类型:$g++-4.7-std=c++0x-O3-Wall-Wextrat.cc-ot$clang++-3.2-std=c++0x-O3-Wall-Wextrat.cc-ott.cc:6:37:error:memberaccessintoincompl

c++ - std::string 与 unicode 的奇怪行为

我有以下代码:#includestd::stringeps("ε");intmain(){std::cout它以某种方式在Ubuntu上用g++和clang编译,甚至打印出正确的字符ε。我也有几乎相同的一段代码,它愉快地将ε和cin读入std::string。顺便说一下,eps.size()是2。我的问题是-它是如何运作的?我们如何将unicode字符插入到std::string中?我的猜测是操作系统使用unicode处理所有这些工作,但我不确定。编辑对于输出,我知道是终端负责向我显示正确的字符(在本例中为ε)。但是对于输入:cin将符号读取为''或任何其他空格字符(据我所知,逐字节)

c++ - GCC 4.9 和 clang 3.5 中的 std::rbegin 和 std::rend 函数

我一直在MSVC2013中使用std::rbegin和std::rend。当我尝试使用GCC4.9.1或clang3.5.0编译我的代码时,两者都告诉我“rbegin”和“rend”是不是命名空间“std”的一部分。请参阅下面的代码示例。我是在做错什么,还是只是尚未在GCC和clang中实现?//test.cpp#include#include#includeintmain(int,char**){std::vectortest={1,2,3,4,5};for(autoit=std::rbegin(test);it!=std::rend(test);++it){std::cout海湾合

C++ 重新定义变量,全局命名空间被污染,我不知道为什么

所以我认为我做了一些非常愚蠢的事情,我就是想不通。下面的程序让我很痛苦:#includeinttime=0;intmain(intargc,char**argv){std::cout我的编译字符串是:clang++-std=c++1y--verbose-stdlib=libc++main.cpp-omain。重新定义错误是/usr/include/time.h:116:8:note:previousdefinitionishere并且--verbose将此显示为包含路径顺序:AppleLLVMversion6.0(clang-600.0.56)(basedonLLVM3.5svn)Ta

c++ - 我相信这是 clang 中的一个错误,与构造函数抛出的放置新表达式有关

当new-expression的形式为new(std::nothrow)C;时,问题就出现了其中C是其构造函数抛出的类名。请参阅下面的代码和liveexample使用g++:#includevoid*operatornew(std::size_tsize,conststd::nothrow_t&)noexcept{void*p;p=malloc(size);std::coutg++打印以下内容,它似乎是正确的:operatornew(std::nothrow)C()operatordelete(std::nothrow)0x13f9c20exceptionthrowninC(int)w

c++ - 重载抽象运算符时出现 Clang 链接器错误=

VisualStudio2013编译器可以很好地处理以下代码,但clang5.0和6.2给我一个链接器错误:#includeusingnamespace::std;classIBase{public:virtualIBase&operator=(constIBase&other)=0;};classBase:virtualpublicIBase{public:Base&operator=(constIBase&other)override{constBase&b=dynamic_cast(other);return*this=b;}virtualBase&operator=(const

c++ - clang:自定义属性在 AST 中不可见

我按照官方手册中的描述在clang中实现了一个自定义属性:http://clang.llvm.org/docs/InternalsManual.html#how-to-add-an-attribute所以我在Attr.td中添加了以下代码:defMyAttr:InheritableAttr{letSpellings=[GNU,CXX11,GCC,Declspec];letSubjects=SubjectList;letDocumentation=[MyAttrDocs];}以及AttrDocs.td的文档。重建clang后,它显然知道该属性,因为我在使用它时没有收到未知属性警告。我什至