C预处理器有一个叫做stringification的特性.这是一个允许从宏参数创建(窄)字符串文字的功能。可以这样使用:#definePRINTF_SIZEOF(x)printf("sizeof(%s)==%d",#x,sizeof(x))/*stringification^^*/使用示例:PRINTF_SIZEOF(int);...可能打印:sizeof(int)==4如何从宏参数创建一个宽字符串文字?换句话说,我该如何实现WPRINTF_SIZEOF?#defineWPRINTF_SIZEOF(x)wprintf() 最佳答案
我正在尝试获取操作系统和编译器名称作为C++中的字符串。尽管对此有很多疑问,但我没有找到明确的答案。所以我尝试使用Boost.Predef1.55,它定义了BOOST_OS_类型的宏。和BOOST_OS__NAME.因此可以简单地做if(BOOST_OS_)returnBOOST_OS__NAME;对于每个操作系统boost支持。与COMP的编译器相同而不是OS.为了避免重复,我想使用Boost.Preprocessor并将它们全部放在一个循环中。我想出的是这个:#defineMAKE_STMT_I2(PREFIX)if(PREFIX)returnPREFIX##_NAME;#defi
GCC__attribute__((pure))和__attribute__((const))分别允许将函数声明为无副作用和引用透明;假设我想编写pure_assert和const_assert宏,其参数必须是适当严格级别的表达式,即:assert(oops_a_side_effect());静默导致调试和发布中的不同行为,但是:pure_assert(oops_a_side_effect());const_assert(oops_read_a_global());至少在调试版本中会出现编译时错误。由于我希望是显而易见的原因,您不能只创建一个声明为__attribute__((pure
我在OSXLion中运行QtCreator,每当我创建一个需要Q_OBJECT宏的类时,我都会在尝试构建我的应用程序时遇到错误。该类的代码如下,我收到的错误也是如此。有什么线索吗?注意:我已经尝试清理、运行qmake和重新构建都无济于事。#ifndefTASKLIST_H#defineTASKLIST_H#includeclassTaskList:publicQObject{Q_OBJECTpublic:explicitTaskList(QObject*parent=0);publicslots:voidaddTask();voiddisplayTasks();};#endif//TA
我正在努力实现这一目标:char*fname="results5.txt"使用这样的宏:#defineFILENAME(NUM)"results"NUM".txt"intnumber=5;char*fname=FILENAME(number);这样可以吗?怎么了?谢谢。 最佳答案 C因为你标记了C并且想要基于宏的解决方案,所以在宏中使用##defineFILENAME(NUM)"results"#NUM".txt"^^^^^char*fname=FILENAME(5);注意这种方式不能使用变量。intnumber=5;char*fn
宏“VER”在其他一些我无法更改的头文件中被定义为“((u_long)1)”。在我的代码中,我需要使用“test”和VER组合函数“test_1”。但是编译器报告错误,因为它是“test_((u_long)1)”而不是“test_1”生成的。我的问题是:如何编写宏来生成“test_1”?提前致谢!#defineVER((u_long)1)/*ThisisdefinedinsomeotherheaderfilewhichIcan'tchange*/#definepaste(x,y,z)x##y##z#definepaste2(x,y,z)paste(x,y,z)#definefcall(
我想创建一个自定义版本的assert中定义的宏,当断言失败时显示错误消息。所需的用法:custom_assert(AClass::aBoolMethod(),"aBoolMethodmustbetrue");有缺陷的测试实现:#definecustom_assert(mCondition,mMessage)...//ThisfailsbecausemConditionmayhavecommasinit#definecustom_assert(...,mMessage)//Notsureaboutthiseither-mMessagemaybeanexpressioncontaining
小问题:是否允许为字符串连接宏##连接特殊符号,例如+、-?例如,#defineOP(var)operator##varOP(+)会扩展为operator+吗?具体问题:#include"z3++.h"#includenamespacez3{z3::exproperator+(z3::exprconst&,z3::exprconst&);}typedefz3::expr(*MyOperatorTy)(z3::exprconst&,z3::exprconst&);#defineSTR(var)#var#definez3Op(var)static_cast(&z3::operator##v
为什么在定义错误/HRESULT处理/日志记录时会选择或不选择使用宏?我正在处理一个通过接口(interface)调用的错误处理类,因此我可以使用Boost共享指针在我需要的时间和地点调用该类。(老实说;我不知道这是否是最好的方法,但我主要想看看我是否能做到,以及它会是什么样子)。即:typedefstd::shared_ptrError_Handler;Error_HandlerErr_Handler(newErrHandling);if(error){Err_Handler->vDX_ERR(ERR_D3D_INIT_SWAP);}我开始在DirectX中使用该类,由于Direct
当我想对我用boost::test编写的一个小类进行单元测试时,我发现如果您传递的语句包含',',则不能直接使用用于CHECK/REQUIRE/....的boostMACRO.以下示例无法编译,因为预处理器报告宏“BOOST_CHECK_NO_THROW”传递了2个参数,但只需要1个BOOST_CHECK_NO_THROW({cache_maptest1(3);});为了确认它来self们用来分隔模板参数的逗号,我使用了以下内容并且编译没有问题。BOOST_CHECK_NO_THROW({stringtest1("test");});解决方法是使用typedef别名而不是显式类型,但您