关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。关闭4年前。Improvethisquestion不同的C++风格指南反对使用C预处理器宏。我知道有一些工具可以帮助检测由于使用宏而导致的错误(CPPCHECKER、Check),以及在存在预处理器指令(CSCout、XRefactory)的情况下提供重构的工具。我想知道是否有任何重构工具建议替代C++程序中的宏(如内联函数、常量表达式)。
在将项目从VisualStudio2005移植到2013时,我遇到了这种我无法找到解释的奇怪行为。上下文是关于通过多次包含某个头文件来创建模板特化,但在每次包含之前更改预处理器定义以基本上生成不同的类声明。我可以将问题缩小为以下情况:gen.hpp#ifdefENABLE_GEN#ifdefGEN_SWAP_ORDER//(1)classFoo{};#elseclassBar{};#endif#endifmain.cpp#defineENABLE_GEN#include"gen.hpp"#defineGEN_SWAP_ORDER#include"gen.hpp"intmain(){Fo
我正在尝试构建一个宏M,它将扩展为两种可能性之一,具体取决于它是否具有一个或多个参数:M(x)应该扩展到f(x)同时M(x,"%d%d%d",1,2,3)应该扩展到g(x,"%d%d%d",1,2,3)函数签名在哪里f(intx);g(intx,constchar*fmt,...);有variousanswers如果参数计数已知,则关于宏的“重载”;然而,他们确定__VA_ARGS__长度的方法都只适用于有限的选定数字。是否有任何技巧可以使类似的方法适用于我的“一个参数/多个参数”的情况?注意:重载函数不是一个选项,因为在我的例子中,它们实际上是两个不同类的构造函数。
这类似于Whatdifferences,ifany,betweenC++03andC++11canbedetectedatrun-time?.但在这种情况下,我希望通过预处理器进行检测。我们应该如何守护moveconstructor(和moveassignment)当源代码同时用于C++03和C++11时?以下是否足够(movesemantics是所有C++编译器都采用的东西,因为它是必不可少的/核心功能)?#if(__cpluplus>=201103L)Foo(Foo&&other);#endif或者我需要深入了解编译器细节吗?如果我们需要编译器特定的宏,那么我们如何处理类似Visu
我有一些模板函数,我想在C++中使用define调用它:#defineCONFIG(key,type,def)getValue(key,def);当然不行。我可以做这样的东西吗? 最佳答案 它工作正常:templateTgetValue(int,int){returnT();}#defineCONFIG(key,type,def)getValue(key,def);intmain(){CONFIG(1,int,2);return0;} 关于c++-定义中的模板函数,我们在StackOve
如何包装一行预处理器指令并忽略多余的空间?测试代码:#errorLine0\Line1结果:short_test.cpp(1):error:#errordirective:Line0Line1#errorLine0\^虽然我想在测试代码中保留缩进模式,但我不想在结果中显示第0行和第1行之间的间距。这可能吗?我想要的结果:short_test.cpp(1):error:#errordirective:Line0Line1nospacebetweenLine0andLine1我想要的测试代码#errorLine0\(extrastuff?)Line1 最佳答案
我们有一个分析框架,可以在编译时启用和禁用。所有对框架的各种调用都是通过宏完成的,例如:PROFILE_START(msg)PROFILE_END(msg)然后宏会在启用分析时解析为实际的分析器调用,而在禁用时则为空#ifdefPROFILING_ENABLED#definePROFILE_START(msg)currentProfiler().start(msg)#definePROFILE_END(msg)currentProfiler().end(msg)#else#definePROFILE_START(msg)#definePROFILE_END(msg)#endif我们的框
在C++库中工作时,我注意到在诸如“#ifndefCLIENT_DLL...#endif”之类的指令block中时,我没有获得任何智能感知。这显然是因为定义了“CLIENT_DLL”。我意识到我可以通过简单地注释掉指令来解决这个问题。是否有任何智能感知选项可以在不考虑指令评估的情况下启用智能感知? 最佳答案 得到你想要的,你会失去很多。VisualC++IntelliSense基于几个主要假设1.你想要好的/可用的结果。2.您当前的IntelliSensecompiland将显示与您当前所在的“配置”相关的信息。因为您当前的配置具有
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:gccpreprocessoroutput出于某种原因,我需要调查一些由g++预处理器生成的.i文件,我在其中看到如下代码:#1/usr/local/include/boost/python.hpp13#11/usr/local/include/boost/python.hpp3我是一名经验丰富的C++程序员,我知道.i文件是什么,问题是,我找不到关于如何解释.i文件中的行的详细解释。谁能解释一下上面几行的意思(尤其是文件后面的数字是什么意思),或者告诉我一个可以找到相关文档的地方?谢谢,看了链接后,我的问题
我正在尝试使用GCC编译此代码,并且我有这些#pragma指令,我正在尝试将它们转换为GCC可理解的指令,但我不知道如何:#pragmasection(".CRT$XCA",read,write)#pragmadata_seg(".CRT$XCA")//startofctorsection_PVFV__xc_a[]={0};#pragmasection(".CRT$XCZ",read,write)#pragmadata_seg(".CRT$XCZ")//endofctorsection_PVFV__xc_z[]={0};#pragmadata_seg()#pragmacomment(l