C中的"this"指针(不是C++)

foo*_*foo 14 c function-pointers

我试图在C中创建一个堆栈以获得乐趣,并想出了使用struct来表示堆栈的想法.然后我为push()和pop()操作添加了结构的函数指针.

到目前为止看起来一切都很好,但是,对于push()和pop()函数的实现,我需要以某种方式引用*.怎么能(可以吗?)完成?

这是我的结构

struct Stack {
    int *data;
    int current_size;
    int max_size;
    int (*push)(int);
    int (*pop)();
};
Run Code Online (Sandbox Code Playgroud)

作为一个例子,这是推动

int push(int val) {
    if(current_size == max_size -1)
            return 0;

    data[current_size] = val;
    current_size++;

    return 1;
}
Run Code Online (Sandbox Code Playgroud)

你可以想象,编译器不知道是什么current_size,就像它期望的那样stack->current_size.

这有可能以某种方式克服吗?

NPE*_*NPE 27

thisC中没有隐含的内容.明确说明:

int push(Stack* self, int val) {
    if(self->current_size == self->max_size - 1)
            return 0;

    self->data[self->current_size] = val;
    (self->current_size)++;

    return 1;
}
Run Code Online (Sandbox Code Playgroud)

您当然必须将指向结构的指针传递给每个调用push和类似的方法.

这基本上是C++编译器在您定义Stack为类和push等方法时为您所做的事情.

  • 这就是想法,但如果有人试图将你的C包含在C++程序中,那么使用`this`作为变量是很尴尬的. (3认同)
  • 除了“这个”之外,还有很多原因为什么在 C++ 源文件中包含 C 代码是无效的,并且可能导致重大错误。只是不要这样做。如果“this”作为变量名有意义(就像这里一样),请使用它。 (2认同)
  • @foo:将函数指针放入结构中仍然有一点。您永远不应该使用“push”和“pop”等通用名称来声明外部函数,特别是当代码最终可能成为库的一部分时。因此,您要么需要将它们命名为“foo_push”和“foo_pop”,要么您可以在堆栈的实现文件中将它们隐藏为“static”,并让“foo_allocstack”返回一个堆栈对象,并将函数指针设置为指向这些静态函数。后一种解决方案的开销更大,但它可能很有用。 (2认同)