C 在创建结构变量后初始化结构中的常量变量

C 在创建结构变量后初始化结构中的常量变量,c,C,我有一个c结构,它有一个常量变量 typedef struct { u32 status; const u32 dir_search_idx;} FS_OBJ; 我想做的是在创建struct对象后初始化函数中的const变量。我想我想做一些类似于构造函数在C++中做的事情。有可能在c中做类似的事情吗?谢谢如果您使用C99或更高版本,并且希望在创建结构时初始化const变量,那么这应该可以很好地工作: FS_OBJ obj = { .status = /* something */, .dir_

我有一个c结构,它有一个常量变量

typedef struct {
u32 status;
const u32 dir_search_idx;} FS_OBJ;

我想做的是在创建struct对象后初始化函数中的const变量。我想我想做一些类似于构造函数在C++中做的事情。有可能在c中做类似的事情吗?谢谢

如果您使用C99或更高版本,并且希望在创建结构时初始化const变量,那么这应该可以很好地工作:

FS_OBJ obj = { .status = /* something */, .dir_seach_idx = /* something */ };
创建结构后,不能修改常量变量。然后,您必须删除注释中提到的const关键字。

我认为const不是您所寻找的合适工具。您可以将数据结构和行为函数放在*.c文件中,并在相应的头文件中提供公共函数。这样,你可以模仿你想要的等效C++代码,并隐藏数据,当然,你可以定义构造函数。一本可能有用的好书是。在第3章中,您可以找到一个很好的介绍半面向对象编程的C语言。 以下是一个可能的实施方案,不一定是最好的:

/src/main.c

#include <stdio.h>
#include "point.h"

int main()
{
    Point *p1 = init(6, 7);
    printf("%d\n", getX(p1));
    printf("%d\n", getY(p1));

    Point *p2 = init(12, 14);
    printf("%d\n", getX(p2));
    printf("%d\n", getY(p2));
    
    setX(p2, 16);
    printf("%d\n", getX(p2));
    setY(p2, 16); /* error; we want y to initialize once and remain constant. Also accessing y with p2->y is an error too. */
    printf("%d\n", getY(p2)); /* getY is ok */
    
    freep(p1);
    freep(p2);
}
/src/point.c

#include <stdlib.h>
#include "point.h"

struct _Point{
    int x;
    int y;
};

Point *init(int x, int y)
{
    Point *temp;
    temp = malloc(sizeof(Point));
    temp->x = x;
    temp->y = y;
    
    return temp;
}

int getX(Point *p)
{
    return p->x;
}

void setX(Point *p, int x)
{
    p->x = x;
}

int getY(Point *p)
{
    return p->y;
}

void freep(Point *p)
{
    free(p);
}

此外,如果我们在类中需要一个私有方法,我们不在报头中提供它的声明,也使用静态来限制它在类文件中的访问。C++对象在创建对象时被调用。对于已创建的对象,不会调用它们。因此,您可以在创建结构类型的对象时初始化结构的数据成员。如果在创建后更改它,则不是常量。所以删除const关键字。我需要var是一个const,因为我希望代码得到优化。我只需要一种方法来设置const onceDoes的值,const必须在创建结构后初始化,然后在创建结构时进行设置。因此,您调用一个返回搜索索引的函数,然后使用搜索索引作为初始值设定项创建结构。@VladFrommosco创建结构后初始化变量对他来说似乎并不重要,因为他说我只需要一种方法在注释中设置一次常量的值。我不想在创建它时必须初始化这些值,然后不要使用const.obj->dir\u search\u idx=/*something*/将不起作用-dir\u search\u idx是常量。@KamilCuk即使我只为结构分配内存?如果是这种情况,我将回滚编辑。如果对象不可修改,则丢弃常量将导致UB。

#include <stdlib.h>
#include "point.h"

struct _Point{
    int x;
    int y;
};

Point *init(int x, int y)
{
    Point *temp;
    temp = malloc(sizeof(Point));
    temp->x = x;
    temp->y = y;
    
    return temp;
}

int getX(Point *p)
{
    return p->x;
}

void setX(Point *p, int x)
{
    p->x = x;
}

int getY(Point *p)
{
    return p->y;
}

void freep(Point *p)
{
    free(p);
}