似乎我经常花太多时间试图让一个#define宏做我想做的事情。我会在下面发布我目前的困境,任何帮助都很感激。但实际上更大的问题是,是否有任何实用程序可以推荐,以快速显示宏实际上在做什么?似乎即使是缓慢的试验和错误的过程会快得多,如果我能看到什么是错的。
目前,我正在从我制作的DLL中动态加载一长串函数。我设置的方法是,函数指针与导出的函数具有相同的名称,并且用于原型化它们的typedef具有相同的名称,但带有前缀下划线。所以我想用一个define来简化一个长长的函数指针列表的赋值。
例如,在下面的代码语句中,'hexdump'是typedef'd函数点的名称,也是函数的名称,而_hexdump是typedef的名称。如果GetProcAddress()失败,则失败计数器递增。
if (!(hexdump = (_hexdump)GetProcAddress(h, "hexdump"))) --iFail;
所以让我们假设我想用一个宏来替换上面的每一行,像这样.
GETADDR_FOR(hexdump )
这是目前为止我能想到的最好的了它不工作(我的//注解只是为了防止消息中的文本格式).
// #define GETADDR_FOR(a) if (!(a = (#_#a)GetProcAddress(h, "/""#a"/""))) --iFail;
再说一次,虽然我很感激我所犯的愚蠢的错误,但如果有一个实用程序,只需插入我的宏,就可以告诉我我的错误。
5条答案
按热度按时间mlnl4t2r1#
x1c 0d1x转到https://godbolt.org/。在左窗格中输入您的代码,并选择compiler as gcc,在右窗格中将参数设置为-E。您的预处理代码将显示在右侧。
stszievb2#
你可以通过预处理器运行你的代码,它会告诉你它将被扩展成什么(或者根据需要吐出错误):
在GCC中,
gcc -E foo.c
只对文件进行预处理。Visual Studio uses
/P
参数。fnatzsnv3#
http://visualstudiogallery.msdn.microsoft.com/59a2438f-ba4a-4945-a407-a1a295598088-用于扩展宏的Visual Studio插件
rdrgkggo4#
您似乎对C预处理器宏中字符串化或标记粘贴的确切语法感到困惑。
你可能会发现这个页面对C preprocessor macros in general有帮助。
特别是,我认为这个宏应该这样读:
结尾的
;
应该被跳过,因为你很可能会把它输入为GETADDR_FOR(hexdump);
,如果你不这样做,它在你的C代码中看起来会很奇怪,并且会让很多语法高亮显示器感到困惑。正如其他人提到的,
gcc -E
将运行预处理器并跳过其他编译步骤。这对于调试预处理器问题很有用。fzsnzjdm5#
你可能想看看Boost Wave。与大多数Boost一样,它实际上更像是一个库而不是实用程序,但它确实有一个驱动程序来充当完整的预处理器。