草庐IT

AT指令

全部标签

c++ - 有没有办法逃避 C 预处理器指令?

我想做的是让C预处理器输出#ifdef、#else和#endif指令。也就是说,我想以某种方式“转义”一个指令,以便预处理器的输出包含该指令,预处理器将在输出上运行。是否可以“转义”CPP指令,以便它由预处理器输出,如果CPP输出本身被预处理,则转义指令的输出将是预处理器指令? 最佳答案 MarceloCantos'sanswer的轻微变体在GNUcpp4.4.3上为我工作:#defineHASH(x)x...HASH(#)ifdef__cplusplusclassfoo{};HASH(#)endif

c++ - 预处理器宏扩展到另一个预处理器指令

起初我以为我需要这个,但我最终避免了它。然而,我的好奇心(以及求知欲,嗯)让我问:可以预处理器宏,例如在#include"MyClass.h"INSTANTIATE_FOO_TEMPLATE_CLASS(MyClass)扩展到另一个包含,例如#include"MyClass.h"#include"FooTemplate.h"templateclassFooTemplate;? 最佳答案 我相信这是不可能的,这是因为预处理器是单channel。因此它不能发出其他预处理器指令。具体来说,来自C99标准(6.10.3.4第3段):3The

c++ - 当 std::map::at 超出范围时返回什么?

在游戏中,我想搜索元素map并返回位于棋盘特定方格上的元素。但是,如果广场是空的呢?(这些项目未存储在板结构中。为了这个问题的目的,不要介意。)我有下面的代码,但是我应该怎么做才能返回“空”引用?map,Item*>_items;Item&itemAt(introw,intcol)const{try{return*_items.at(make_pair(row,col));}catch(out_of_range&e){return//whatgoeshere?}}或者这是错误的方法,我应该只使用find()? 最佳答案 如果在您的程

c++ - 您多久检查一次 C++ 新指令中的异常?

我今天刚开始阅读EffectiveC++,到了作者谈论operatornew的地步。这本书很好地解释了如何捕获(以不同程度的优雅)operatornew在内存不足时可能引发的std::bad_alloc异常。我的问题是:当没有足够的内存来实例化对象时,您多久检查一次这种情况(如果有的话)?为什么?值得这么麻烦吗? 最佳答案 当我可以回答这个问题时我会捕获异常:Whatwillyoudowiththeexceptiononceyou'vecaughtit?大多数时候,我的回答是,“我不知道。也许我的来电者知道。”所以我没有发现异常。让

c++ - 在 C++ 中使用乘法累加指令内联汇编

我正在ARM9处理器上实现FIR滤波器并尝试使用SMLAL指令。最初我实现了以下过滤器并且它工作得很好,除了这种方法使用太多的处理能力而无法在我们的应用程序中使用。uint32_tDDPDataAcq::filterSample_8k(uint32_tsample){//Thisroutineisbasedonthefir_double_zroutineoutlinebyGrantRGriffin//-www.dspguru.com/sw/opendsp/alglib.htminti=0;int64_taccum=0;constint32_t*p_h=hCoeff_8K;constin

c++ - 为什么 `at` 和 `operator []` 没有实现异构比较查找?

自C++14(N3657)成员函数模板find,count,lower_bound,upper_bound,关联容器的equal_range支持异构比较查找,但at和operator[]没有那些等效的成员函数模板。为什么会这样?例子:std::map>m;//...autoit=m.find("foo");//doesnotconstructanstd::stringauto&v=m.at("foo");//constructanstd::string 最佳答案 原则上没有合乎逻辑的理由。例如operator[]一个合理的语义可能是

c++ - 让编译器生成 adc 指令

有什么方法可以让Clang、GCC或VS仅使用标准C++(98/11/14)生成adc(带进位的加法)指令?(编辑:我的意思是在x64模式下,如果不清楚,请见谅。) 最佳答案 如果您的代码进行比较并将比较结果添加到某物中,则gcc5通常会发出adc(顺便说一下,gcc4.8不会发出adc这里)。例如,unsignedfoo(unsigneda,unsignedb,unsignedc,unsignedd){return(a+b+(c组装成foo:cmpl%ecx,%edxmovl%edi,%eaxadcl%esi,%eaxret但是,

c++ - CMake "project"指令的正确用法是什么

我有一个很大的代码库,它构建了几十个库和几个可执行文件。代码库按层级分解,几乎每个级别都构建了库。我已经完成并在每个目录中放置了一个CMakeLists.txt文件来构建每个库。在每个CMakeLists.txt中,我都使用了“project(xxx)”指令。这为我定义了PROJECT_NAME、PROJECT_SOURCE_DIR和PROJECT_BINARY_DIR变量,我明智地使用了这些变量。但是,团队中的一个人对这种方法不满意,因为他找不到任何其他人这样做过的真实示例。他经常引用KitWare示例作为未使用这种方法,因此我们也不应该。他提倡的另一种方法是在每个makefile中

c++ - 为什么在使用命名空间指令时没有为函数添加命名空间?

这个c++文件...namespacefoo{classC{voidm();};voidf();}usingnamespacefoo;voidC::m(){}voidf(){}..用这些符号编译成目标文件:$g++foo.cpp-c$nmfoo.o-C000000000000000aTf()0000000000000000Tfoo::C::m()为什么C::m()?得到前缀的命名空间,而不是f()?(我不是使用usingnamespacefoo,而是使用namespacefoo{...}然后两个名称都有foo前缀)。 最佳答案 在v

c++ - Clang 问题 : implicit type conversion at construction time

概要我正在努力使C++11代码与Clang兼容,并遇到了GCC>=4.6接受代码而Clang>=3.1不接受的情况。Clang认为候选构造函数不可行。详情这里是一个精简的例子来说明这个问题:#includetemplatestructT;templatestructT{typedefTsuper;constexprT(){}templateT(Args&&...){}};templatestructT:T{typedefTsuper;Headhead;T(Headarg):super(),head(std::move(arg)){}};structvoid_type{constexpr