我正在做一个小项目,只是为了有趣的C语言中的OO。我遇到的问题对我来说很奇怪。下面的程序是整个程序。
[编译并运行后,所有“方法”都可以正常工作...直到击中第一个“ puts”为止。在这一点上,“方法”在这一点上已经失去了对“自我”的引用。
我不确定为什么在此之前会奏效,但之后不会。值得注意的是,在第二个“ puts”之前再次执行“ constructor”将使其起作用。 'if'链明确表明这些方法有效,因为它们正确设置了新字符串。
我确实意识到可以通过将参数的“对象”地址简单地传递给“方法”来解决此问题,但这是帖子的重点,我想找到一种简洁的方法来解决此问题。
#include <stdio.h>
//-----class_a--------------------------------------------------------------//
typedef struct{
char* string;
char* (*get_string)();
char* (*set_string)(char*);
} class_a;
void constructor_class_a(class_a *self, char* string){
self->string = string;
char* get_string(){
return self->string;
} self->get_string = get_string;
char* set_string(char* new_string){
return self->string = new_string;
} self->set_string = set_string;
}
//--------------------------------------------------------------------------//
int main(){
class_a object_a;
constructor_class_a(&object_a, "default string");
printf("string: %s\n", object_a.get_string());
if (object_a.get_string()=="default string"){
object_a.set_string("temporary string");
if (object_a.get_string()=="temporary string"){
object_a.set_string("final string");
if (object_a.get_string()=="final string"){
printf("string: %s\n", object_a.get_string());
}
}
}
printf("%s", object_a.get_string());
return 0;
}
我尝试这样做无济于事(包括'class'的int init成员):
char* get_string(){
static class_a *self2 = {0};
if (!self2->inti){
*self2 = *self;
self2->init = 1;
}
return self2->string;
} self->get_string = get_string;
问题是您正在尝试使用嵌套函数,它们不是C语言的一部分,而是GCC扩展,但是使用不正确。它们的生命周期在嵌套的块末尾结束,并且在生命周期结束后对它们的函数指针的任何使用都具有未定义的行为。
即使这样做确实可行,这也是一个糟糕的主意,因为具有指向嵌套函数的指针的能力必然取决于拥有可执行堆栈,因此不建议使用该堆栈,因为它使大多数漏洞都变得微不足道。这是clang和其他编译器拒绝复制此GCC功能的许多原因之一,以及该功能实际上已失效的原因。