你如何在 C 中指定变量是最终的?
How do you specify variables to be final in C?
我知道可以使用 #define
宏声明常量。这样,将整数、浮点数或字符文字定义为常量就很简单了。
但是,对于更复杂的数据结构,例如数组或结构,例如:
typedef struct {
int name;
char* phone_number;
} person;
我希望能够将其初始化一次,然后将其设为不可编辑的结构。
在面向对象的语言中,存在 final
关键字可以很容易地做到这一点,但在 C 中没有这样的东西。我想到的一种解决方法是使用 setjmp
和 longjmp
来模拟 try-catch 括号并在检测到更改时进行回滚。您需要将备份存储在 file/in 内存对象中,如果您有许多此类对象要防止意外更改,这可能会变得有点混乱。
问:是否可以在 C 中有效地表示这种模式?如果是,如何实现?
使用const
作为变量的关键字。这是一种防止以后修改值的方法。
const int a = 5;
a = 7; //Error, you cannot modify it!
例如,在具有闪存的嵌入式系统中,链接器可能会将此变量放入闪存(如果可用)。不过大可不必。
C 中的等效关键字是 const
。
const
是要走的路。 const
是一个关键字,可能会告诉编译器两件事:
强制对象的恒定性。
const YourType t;
声明一个不可修改的对象。编译器将强制执行常量正确性。重要的是要注意,const 正确性是由编译器在概念上强制执行的,并且有一些方法可以规避这些规则。
指针的恒定性(或对对象的访问)
const int* pointer
声明一个指向 int(不是 const)的 const 指针。这意味着如果有一个指向该 int 的非常量指针,那么它可以被修改。
有关详细信息,请参阅 this great answer。
我知道可以使用 #define
宏声明常量。这样,将整数、浮点数或字符文字定义为常量就很简单了。
但是,对于更复杂的数据结构,例如数组或结构,例如:
typedef struct {
int name;
char* phone_number;
} person;
我希望能够将其初始化一次,然后将其设为不可编辑的结构。
在面向对象的语言中,存在 final
关键字可以很容易地做到这一点,但在 C 中没有这样的东西。我想到的一种解决方法是使用 setjmp
和 longjmp
来模拟 try-catch 括号并在检测到更改时进行回滚。您需要将备份存储在 file/in 内存对象中,如果您有许多此类对象要防止意外更改,这可能会变得有点混乱。
问:是否可以在 C 中有效地表示这种模式?如果是,如何实现?
使用const
作为变量的关键字。这是一种防止以后修改值的方法。
const int a = 5;
a = 7; //Error, you cannot modify it!
例如,在具有闪存的嵌入式系统中,链接器可能会将此变量放入闪存(如果可用)。不过大可不必。
C 中的等效关键字是 const
。
const
是要走的路。 const
是一个关键字,可能会告诉编译器两件事:
强制对象的恒定性。
const YourType t;
声明一个不可修改的对象。编译器将强制执行常量正确性。重要的是要注意,const 正确性是由编译器在概念上强制执行的,并且有一些方法可以规避这些规则。
指针的恒定性(或对对象的访问)
const int* pointer
声明一个指向 int(不是 const)的 const 指针。这意味着如果有一个指向该 int 的非常量指针,那么它可以被修改。
有关详细信息,请参阅 this great answer。