【发布时间】:2014-06-02 10:45:58
【问题描述】:
我有一些程序为我生成的代码,我真的不明白为什么它会这样做。语言是纯 C 语言,生成一个结构体。
.h 文件:
struct X_IMPL {
sint32 y;
};
struct X {
struct X_IMPL * IMPL;
};
.c 文件:
#define _my_y self->IMPL->y
sint32 do_something(struct X * self)
{
return _my_y*13;
}
我确实假设_my_y 现在指向结构内的一个变量,并且可以用来更改结构的变量。我的问题是,为什么会以这种方式生成代码?与仅使用参数的引用相比有什么优势吗?当使用这样的定义创建引用时,我真的需要那个参数吗?
【问题讨论】:
-
我不太明白你的问题。
#define不会“创建”任何东西,它只是一个文本替换宏。如果源有_my_y,编译器将看到self->IMPL->y。也不确定在这种情况下您所说的“参考”是什么意思。 -
它所做的只是减少代码的冗长(想象一下,如果你在
do_something中有很多代码,那么到处都有self->IMPL->y可能会变得重复。也就是说,在宏后面隐藏这样的东西是通常被认为是不好的做法(至少对于人类编写的代码而言!)。 -
@unwind:作为参考,我的意思是
my_y和self->IMPL->y将指向内存中的同一个位置。 -
@Pphoenix 我认为您并没有真正理解这段代码中发生了什么。
_my_y在编译后的程序中不作为符号存在;它是#define的名称,因此它将被预处理器替换,编译器永远不会看到它。尝试读取预处理器输出(-E使用 gcc)。 -
宏需要变量
self在使用它的地方可用,是的。在这样的代码(C 中的面向对象函数)中,您必须始终传递一个指向该方法应该操作的对象的self(或this)指针。
标签: c struct reference c-preprocessor self