#ifndefNULL#defineNULLNULL#endif此代码在gcc中编译,没有警告/错误。有人可以解释预处理器在这里做什么吗? 最佳答案 编译器在任何地方看到文本“NULL”,它都会用文本“NULL”替换它。这就像在您的代码中搜索并替换“NULL”并替换为“NULL”。不违法,只是很奇怪:) 关于c++-#defineNULL空,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questi
而不是每次都做下面的事情start();//somecodeherestop();我想定义某种宏,这样就可以这样写:startstop(){//codehere}在C++中可以吗? 最佳答案 您可以使用一个小的C++帮助程序类做一些非常接近的事情。classStartStopper{public:StartStopper(){start();}~StartStopper(){stop();}};然后在你的代码中:{StartStopperss;//codehere}当执行进入block并构造ss变量时,会调用start()函数。当执
我有以下代码:#defineLIMIT_DATE\"01-03-2010\"#ifdefLIMIT_DATE#if_MSC_VER#pragmamessage("Warning:thisreleasewillexpireon"LIMIT_DATE)#elif__GNUC__#warning("Warning:thisreleasewillexpireon"LIMIT_DATE)#endif#endif问题是在打印警告时未评估LIMIT_DATE。我在Google上搜索过,但还没有找到解决方案。感谢您的帮助。 最佳答案 Fromgcc
当搜索宏引用时,Eclipse显示文件+引用宏的行。我想file+line+function.搜索其他类型的数据(例如函数)将按预期显示文件+行+函数,所以也许应该在Eclipse配置中为宏调整一些东西?有什么想法吗? 最佳答案 更新-2017年1月CDT的下一个版本(CDT9.3,将于2017年6月发布的EclipseOxygen的一部分)将支持显示包含宏引用的函数。参见Bug508216更多细节。此答案的其余部分是原始答案。长话短说EclipseCDT无法显示引用宏的函数,因为在构建索引时此类信息未包含在索引中。图片为确保我们谈
以下代码来自必须同时使用C和C++编译的现有应用程序。有一个宏:/*Type-checkingmacrotoprovideargumentsforCoCreateInstance()etc.*Thepointerarithmeticisacompile-timepointertypecheckthat'obj'*reallyisa'type**',butisintendedtohavenoeffectatruntime.*/#defineCOMPTR(type,obj)&IID_##type,\(void**)(void*)((obj)+(sizeof((obj)-(type**)(o
我不明白以下程序的输出:#include#defineFOOstd::cout第一个输出是7和7,说明FOO的展开是单逻辑行,但是第二个输出是9和10,表示两条不同的逻辑行。为什么会有差异? 最佳答案 因为1:#include2:3:#defineFOOstd::cout__LINE__扩展为物理行,而不是逻辑行:Thelinenumberofthecurrentsourcelineisonegreaterthanthenumberofnew-linecharactersreadorintroducedintranslationph
我想做的(为了记录目的)是这样的:编写这段代码是为了说明我的问题,实际代码很复杂,是的,即使在C++上我也有充分的理由使用宏=)#defineLIB_SOME1#defineLIB_OTHER2#defineWHERE"atfile#a,line#l,function#f:"//(lookforsyntaxhightlightingerroratSOxd)#defineLOG_ERROR_SIMPLE(ptr,lib,str)ptr->log("ERROR"str\"atlibrary"#lib);#defineLOG_ERROR(ptr,lib,str)LOG_ERROR_SIMPL
是否有可用于检查visualstudio中当前配置类型的宏?根据当前设置,我想包含一个main或dllmain函数:#IFDEFCONFIGURATION_TYPE_EXEintmain(intargc,char**argv){...}#ELSEIFCONFIGURATION_TYPE_DLLBOOLAPIENTRYDllMain(HANDLEhModule,DWORDul_reason_for_call,LPVOIDlpReserved){returnTRUE;}#ENDIF 最佳答案 如果是dll,那么_WINDLL将被定义为继
我想创建一个可以比较2个字符串的宏,如果不满足条件则发出编译时错误。这可以看作是编译时断言。我不确定我该怎么做。例如:STATIC_COMPARE("THISSTRING","THISSTRING")->wouldemitacompiletimeerrorSTATIC_COMPARE("THISSTRING","THISOTHERSTRING)->wouldn'temitacompiletimeerror.宏看起来像#defineSTATIC_COMPARE(str1,str2)if(str1==str2)emitanerrorwithamessage所以我想这个问题归结为能够在编译时
关闭。这个问题需要更多focused.它目前不接受答案。想改进这个问题吗?更新问题,使其只关注一个问题editingthispost.关闭9年前。Improvethisquestion据我所知,宏会在编译器正确识别之前重新排列程序文本,因此可能会导致问题。我很少在C++代码中看到它们,主要是在C中。我所知道的唯一好的用途是包含保护(#ifndef)。是否有任何其他需要使用宏来完成并且不能以更简洁的方式实现的事情?