我想用同名的正确typedef替换宏。我有#defineFooTypechar*在第三方库中,这破坏了我的一些代码(更准确地说:一些我被迫使用的代码,我自己无法更改)。我想用同名的typedef替换它,然后用#undef宏替换它。我试过类似的东西:#defineTMP_MACROFooType#undefFooTypetypedefTMP_MACROFooType;#undefTMP_MACRO但是预处理器将其扩展为:typedefFooTypeFooType;(至少g++-E是这么告诉我的)。所以宏TMP_MACRO不会立即展开。由于“FooType”不存在,因此无法编译。如何用适当
我有如下代码(混合C/C++应用程序)#include#defineBUFFER_SIZEUINT16_MAX我原以为BUFFER_SIZE是(65535)就像UINT16_MAX是在stdint.h中定义的,但编译器却提示UINT16_MAX不是定义。显然,宏展开并没有像我希望的那样发生。我可以自己将其定义为(65535),但想知道为什么这不起作用。对一些评论的回应:我的编译器确实支持uint16_t类型并且UINT16_MAX在stdint.h中定义有人提到定义__STDC_LIMIT_MACROS-我曾尝试在包含stdint.h之前定义它,但没有效果。回答所以它是__STDC_L
我继承了一段(大)代码,它有一个错误跟踪机制,他们将一个bool变量传递给他们调用的所有方法,并且在执行的各个阶段出现错误时,该方法被停止并返回,有时是默认值值(value)。类似(之前):#includeintfun1(intpar1,bool&psuccess){if(par1==42)return43;psuccess=false;return-1;}intfuntoo(inta,bool&psuccess){intt=fun1(a,psuccess);if(!psuccess){return-1;}return42;}voidfunthree(intb,bool&psucces
假设我有一个XMacro对于定义如下的项目列表:#defineX_MACRO(FN)\FN(foo)\FN(bar)\FN(zip)这很好用,我可以调用它来为每个元素生成相同的模板化代码,例如:#definexstr(s)str(s)#definestr(s)#s#definePRINT_X(E)voidprint_##E(){std::cout这会生成类似于voidprint_foo(){std::cout的函数对于每个X_MACRO元素。到目前为止,还不错。但是,现在我希望X宏元素的列表以预处理器宏为条件。例如zip如果USE_ZIP元素应该只包含在X宏中被定义为。当然,我不能放#
C++宏__cplusplus包含和扩展到什么?即使在最古老的C++实现中,宏__cplusplus是否始终包含并扩展为一个数字值?使用#if__cplusplus是否安全还是我们应该使用#ifdef__cplusplus?结论(稍后添加)来自评论和接受的答案:__cplusplus扩展为代表标准版本的数字,90年代初的准标准C++除外(它简单地扩展为1)。是的,即使是在最古老的C++实现中(扩展为数值)。不,#ifdef应该在头文件与C语言共享时使用(因为某些C编译器会在#if检查未定义的宏时发出警告). 最佳答案 是的,它总是扩
我有一堆C++代码中的MACROS,可以扩展成一些函数。我正在调试一些东西。只是想看看代码最终是什么样子的”有什么想法吗? 最佳答案 您可以查看预处理器输出以查看代码经过预处理后的样子。如果您在命令行上将-E标志传递给编译器,gcc和VisualC++都将预处理为stdout。 关于C++宏展开、调试,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/2701533/
我将如何使用GET_WHEEL_DELTA_WPARAMC#中的宏? 最佳答案 为了最清楚起见,我将定义一组这样的函数:internalstaticclassNativeMethods{internalstaticushortHIWORD(IntPtrdwValue){return(ushort)((((long)dwValue)>>0x10)&0xffff);}internalstaticushortHIWORD(uintdwValue){return(ushort)(dwValue>>0x10);}internalstatici
我的电脑上安装了两个版本的C++编译器。其中一个可以识别__COUNTER__宏,而另一个则不能。在做了一些研究以使程序在两者中编译之后,我还没有遇到__COUNTER__的宏定义。这是编译器完成的一些特殊宏,还是我可以将__COUNTER__的定义复制到我的源代码中,如果我可以复制它,我需要什么代码。 最佳答案 __COUNTER__是几个常见编译器中的内置项。无法手动定义。如果您遇到不支持它的编译器,最好的选择可能是在将代码送入编译器之前通过支持它的预处理器运行您的代码。 关于C++
这个问题在这里已经有了答案:DoesC++supportcompile-timecounters?(11个答案)关闭6年前。我有一组C++类,每个类都必须声明一个唯一的顺序ID作为编译时常量。为此,我使用了__COUNTER__内置宏,它转换为一个整数,每次出现它都会递增。id不需要遵循严格的顺序。唯一的要求是它们是顺序的并且从0开始:classA{public:enum{id=__COUNTER__};};classB{public:enum{id=__COUNTER__};};//etcetera...我的问题是:有没有办法使用C++构造(例如模板)实现相同的结果?
我在CMake项目中重用autotools项目的一些C/C++源文件,我看到许多源文件散落着如下行:#ifdefHAVE_UNISTD_H#include//forgetpid()#endif如果getpid()是可选的并且它的调用被等效的HAVE_UNISTD_H指令包围,我会理解这个构造的目的。但是,如果没有HAVE_UNISTD_H,源文件不会编译,并提示getpid()未定义。这感觉比编译器让我知道未找到unistd.h要神秘得多。当然,这只是一个例子。其他流行的宏包括HAVE_STDINT_H、HAVE_INTTYPES_H等,它们的存在是编译源文件所必需的。为什么要包含HA