如果我想扩展一个C宏,除了手动跟踪外,还有什么好方法?

例如,GTK_WIDGET_SET_FLAGS,它使用一个使用一个(或两个)宏的宏...

我只想看到它以某种方式自动扩展,而不是搜索每一个宏,每一步.

更新

我试过cpp,但似乎只做了第一次

打开:

GTK_WIDGET_SET_FLAGS(obj, 13)

我将include文件展开,然后:

G_STMT_START{ ((GTK_OBJECT_FLAGS (obj)) |= (13)); }G_STMT_END

我在stderr上得到的这些错误消息(使用-o文件名时)解释了这一点

gtk/gtkwidget.h:34:21: gdk/gdk.h: No such file or directory
gtk/gtkwidget.h:35:31: gtk/gtkaccelgroup.h: No such file or directory
gtk/gtkwidget.h:36:27: gtk/gtkobject.h: No such file or directory
gtk/gtkwidget.h:37:31: gtk/gtkadjustment.h: No such file or directory
gtk/gtkwidget.h:38:26: gtk/gtkstyle.h: No such file or directory
gtk/gtkwidget.h:39:29: gtk/gtksettings.h: No such file or directory
gtk/gtkwidget.h:40:21: atk/atk.h: No such file or directory

gtk、atk和gdk目录都在当前工作目录中,那么如何让cpp在其中搜索呢?

顺便说一句,gcc -E给出的输出与cpp完全相同

更新2:

通过使用GCC-E并使用-i选项传递包含目录,可以解决包含路径问题

推荐答案

根据您使用的编译器的不同,应该有一种方法可以在完成preprocessor之后查看代码(它进行宏扩展,编译器根本不知道宏).

对于gcc,选项是-E.下面是一个简化的示例,使用toy代码,而不是实际的GTK+宏:

~/tmp> cat cpptest.c
#define SET_FLAGS(w, f) ((w)->flags |= (f))

int main(void)
{
        SET_FLAGS(0, 4711);

        return 0;
}
~/tmp> gcc -E cpptest.c
# 1 "cpptest.c"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "cpptest.c"


int main(void)
{
 ((0)->flags |= (4711));

 return 0;
}

C++相关问答推荐

不同到达时间的轮询实现

ATTiny1606定时器TCA 0中断未触发

返回一个包含数组的 struct

在c++中使用堆栈的有效括号

如何在C客户端应用程序的ClientHello消息中添加自定义扩展?

我在这里正确地解释了C操作顺序吗?

CSAPP微型shell 实验室:卡在sigprocmask

防止C++中递归函数使用堆栈内存

如何计算打印二叉搜索树时每行所需的空间?

OpenSSL:如何将吊销列表与SSL_CTX_LOAD_VERIFY_LOCATIONS一起使用?

GCC奇怪的行为,有fork 和印花,有换行符和不换行符

为什么我无法访问C语言中的文件

问题:C#Define上的初始值设定项元素不是常量

为什么GCC不能在 struct 初始值设定项中以sizeof作为条件的三进制中处理复合文字的编译时求值?

GCC认为这是一个VLA是对的吗?

根据输入/输出将 C 编译过程分为预处理、编译、汇编和链接步骤

使用复合文字数组初始化的指针数组

GDB 用内容初始化数组

当循环变量在溢出时未定义时,可以进行哪些优化?

c中数组上显示的随机元素