草庐IT

define-ing

全部标签

c++ - Clang 与 GCC : Friend-ing a global function via qualified/unqualified names

我正在尝试确定是否针对Clang、GCC或两者提交错误报告(我已经针对Clang主干和GCC4.7.2进行了测试:如果有人可以针对GCC主干验证这一点会有所帮助):基本上,在默认和C++11模式下,使用-fsyntax-only可以很好地编译以下代码三行文件:classA{friendvoidf();};请注意,没有事先声明f(),但这显然没问题。但是,Clang(但不是GCC)拒绝以下内容:classA{friendvoid::f();};来自Clang的错误是“在指定范围内找不到类型为'void()'的名为'f'的函数”,但我在标准中找不到任何理由来区别对待这种情况,所以我认为这是

#define 中的 C++ void 强制转换和运算符逗号

我在阅读一些源代码时发现了这一点。#defineMACRO(x)if((void)0,(x));elsesome_func();我不完全理解运算符逗号和void强制转换背后的原因。这可能与宏保护有关,我知道(void)0有时用于保护宏中的级联else,例如if(...)然后foo();else(void)0.关于为什么存在运算符逗号的任何想法?编辑:我开始认为这与owl有关(0,0). 最佳答案 我猜这个技巧是用来防止用户在if条件中声明变量的。你可能知道,在C++中这样做是合法的if(inti=some_func()){//you

c++ - 在#define 中使用双冒号 (::)

我可以在#define中使用双冒号吗?我想在实现文件中保存一些文字,例如像这样://foo.h#definetemplatetemplate#definefoo::foo::templateclassfoo{T&baz();};#include"foo.tpp"#undeftemplate#undeffoo:://foo.tpptemplateT&foo::baz(){//dostuff.}但是我遇到了我不太理解的语法错误。(参见codepad上的示例):Line11:error:missingwhitespaceafterthemacronameLine10:error:extrat

c++ - 是否有与子系统关联的#define

我正在使用宏创建main,并且需要能够在编译时检查选定的子系统/SUBSYSTEM:WINDOWS或/SUBSYSTEM:CONSOLE,以便生成适当的main函数。有没有我可以检查的#define来完成这个? 最佳答案 _CONSOLE应该可以为您解决问题。您也可以使用#pragmacomment(linker,"/subsystem:windows")或#pragmacomment(linker,"/subsystem:console")选择子系统,如果您真的很想走这条路。 关于c+

c++ - 使用 #ifdefs 和 #define 可选择将函数调用转换为注释

有没有可能做这样的事情#ifdefSOMETHING#definefoo//#else#definefooMyFunction#endif这个想法是,如果SOMETHING被定义,那么对foo(...)的调用将成为注释(或不会被评估或编译的东西),否则它会成为对MyFunction的调用。我见过使用__noop,但我不相信我可以使用它。编辑:我不认为我真的可以在这里使用宏,因为MyFunction接受可变数量的参数。另外,我想让它不评估参数!(因此,像注释掉MyFunction的主体之类的操作并不能真正满足我的需要,因为仍然会评估参数) 最佳答案

c++ - 如何使用 typedef 检查数据类型是否为 "defined"

我今天遇到了这个问题,只是想知道如何检查用typedef定义的新类型是否真的在某处定义。举个例子,我开始使用从源代码构建的Xerces-c3库并编写了一个xml2text转换器。但是我在fbsd上找不到Xerces-c3端口,所以安装了Xerces-c2库。当我尝试重新编译源代码时,出现以下错误:XML2Text.cc:83:error:cannotdeclarevariable'handler'tobeofabstracttype'XML2TextHandlers'XML2TextHandlers.h:32:note:becausethefollowingvirtualfunctio

c++ - 我应该返回一个右值引用(通过 std::move'ing)吗?

一个C++Nextblogpost说过Acompute(…){Av;…returnv;}如果A具有可访问的拷贝或移动构造函数,编译器可能会选择省略拷贝。否则,如果A具有移动构造函数,则移动v。否则,如果A具有复制构造函数,则复制v。否则,会发出编译时错误。我认为我应该总是返回不带std::move的值因为编译器将能够为用户找出最佳选择。但在博客文章的另一个例子中Matrixoperator+(Matrix&&temp,Matrix&&y){temp+=y;returnstd::move(temp);}这里std::move是必要的,因为y必须被视为函数内的左值。啊,读完这篇博文后,我的

c++ - 为什么静态成员函数_declared_是静态的,而在C++中却是_defined_?

这是一个最小的工作示例:啊哈:classA{staticinta_member_function();};A.cpp#include"A.h"intA::a_member_function(){return5;}intmain(){return1;}这段代码编译并运行,但是,在我看来:staticintA::a_member_function(){return5;}可以很容易地用于定义类A的静态成员函数。事实上,有这个要求似乎实际上是相当有用的,因为它会提醒.cpp文件的读者a_member_function是静态的.但是,这显然行不通:error:cannotdeclaremembe

C++ 预处理器#define-ing 一个关键字。是否符合标准?

帮助解决thisquestionaboutbooland1评论中正在进行的辩论:符合标准的C++预处理器能否允许使用#define重新定义语言关键字?如果是这样,符合标准的C++预处理器是否必须允许这样做?如果C++程序重新定义了语言关键字,那么该程序本身是否符合标准? 最佳答案 在C++中,最接近于禁止#define关键字的是§17.4.3.1.1/2,它只在包含标准库头文件的翻译单元中禁止它:Atranslationunitthatincludesaheadershallnotcontainanymacrosthatdefine

c++ - msbuild:在命令行中设置特定的预处理器#define

在C++文件中,我有这样的代码:#ifACTIVATE#pragmamessage("Activated")#else#pragmamessage("NotActivated")#endif我想使用msbuild命令行将此ACTIVE定义设置为1。试过了,还是不行:msbuild/p:DefineConstants="ACTIVATE=1"有什么想法吗? 最佳答案 我参加聚会有点晚了(只有4年左右),但我只需要在一个项目中解决这个问题,并在寻找解决方案时偶然发现了这个问题。我们的解决方案是使用其中定义了/D的环境变量,并结合Visu