任何实用工具来测试扩展C/C++ #定义宏?

nwwlzxa7  于 7个月前  发布在  C/C++
关注(0)|答案(5)|浏览(86)

似乎我经常花太多时间试图让一个#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;

再说一次,虽然我很感激我所犯的愚蠢的错误,但如果有一个实用程序,只需插入我的宏,就可以告诉我我的错误。

mlnl4t2r

mlnl4t2r1#

x1c 0d1x转到https://godbolt.org/。在左窗格中输入您的代码,并选择compiler as gcc,在右窗格中将参数设置为-E。您的预处理代码将显示在右侧。

stszievb

stszievb2#

你可以通过预处理器运行你的代码,它会告诉你它将被扩展成什么(或者根据需要吐出错误):

$ cat a.c
#define GETADDR_FOR(a) if (!(a = (#_#a)GetProcAddress(h, "/""#a"/""))) 
GETADDR_FOR(hexdump)

$ gcc -E a.c
# 1 "a.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "a.c"
a.c:1:36: error: '#' is not followed by a macro parameter

GETADDR_FOR(hexdump)

在GCC中,gcc -E foo.c只对文件进行预处理。
Visual Studio uses/P参数。

rdrgkggo

rdrgkggo4#

您似乎对C预处理器宏中字符串化或标记粘贴的确切语法感到困惑。
你可能会发现这个页面对C preprocessor macros in general有帮助。
特别是,我认为这个宏应该这样读:

#define GETADDR_FOR(a) if (!(a = (_##a)GetProcAddress(h, #a))) --iFail

结尾的;应该被跳过,因为你很可能会把它输入为GETADDR_FOR(hexdump);,如果你不这样做,它在你的C代码中看起来会很奇怪,并且会让很多语法高亮显示器感到困惑。
正如其他人提到的,gcc -E将运行预处理器并跳过其他编译步骤。这对于调试预处理器问题很有用。

fzsnzjdm

fzsnzjdm5#

你可能想看看Boost Wave。与大多数Boost一样,它实际上更像是一个库而不是实用程序,但它确实有一个驱动程序来充当完整的预处理器。

相关问题