如果要扩展C宏,有什么好的方法(除了手动跟踪之外)?
例如GTK_WIDGET_SET_FLAGS,它使用一个宏,该宏使用一个(或两个)宏...
我只想看到它以某种方式自动扩展,而不是搜索过程中每一步的宏。
更新
我尝试了cpp,但它似乎只进行了第一遍
上:

GTK_WIDGET_SET_FLAGS(obj, 13)
我扩展了包含文件,然后:
G_STMT_START{ ((GTK_OBJECT_FLAGS (obj)) |= (13)); }G_STMT_END
这是由我在stderr上得到的这些错误消息所解释的(使用-o filename时)
gtk / gtkwidget.h:34:21:gdk / gdk.h:没有这样的文件或目录
gtk / gtkwidget.h:35:31:gtk / gtkaccelgroup.h:没有此类文件或目录
gtk / gtkwidget.h:36:27:gtk / gtkobject.h:没有这样的文件或目录
gtk / gtkwidget.h:37:31:gtk / gtkadjustment.h:没有此类文件或目录
gtk / gtkwidget.h:38:26:gtk / gtkstyle.h:无此类文件或目录
gtk / gtkwidget.h:39:29:gtk / gtksettings.h:没有此类文件或目录
gtk / gtkwidget.h:40:21:atk / atk.h:没有这样的文件或目录

gtk,atk和gdk目录都在当前工作目录中,那么如何让cpp搜索呢?
顺便说一句,gcc -E提供与cpp完全相同的输出
更新2:
包含路径问题通过使用gcc -E并通过-I选项传递包含目录来解决

最佳答案

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

使用gcc时,选项为-E。这是一个简化的示例,使用玩具代码而不是实际的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;
}

10-05 18:00