在.h文件中
typedef enum
{A1,A2}struct_A;
typedef struct
{const struct_A G;} struct_B;
typedef struct
{const struct_B * F;} struct_C;
typedef struct
{const struct_C *E;} struct_D;
在.c文件中
const struct_D temp;
如何设置/更改值:
temp->E[i].F[0].G
将值设置为const
结构的唯一方法是在声明它时初始化它。所以,解决方案是:
struct_B B = {A1};
struct_C C = {&B};
struct_D temp = {&C};
但是,我没有遇到任何需要这种嵌套的const
结构的场景。
起初:如果我们看到一些合格的const
,我们应该认真对待并避免抛弃常量。如果丢弃全局或静态数据的const限定符,则会得到未定义的行为,并且您将在linux中获得分段错误。
一般来说,正确的方法是Suven Pandey在另一个答案中指出的方法。
但是,有一些有效的案例可以抛弃const。您的案件可能有资格作为https://wiki.sei.cmu.edu/confluence/display/c/EXP05-C.+Do+not+cast+away+a+const+qualification的例外之一
EXP05-C-EX3:因为const表示“只读”而不是“常量”,所以当用户尝试以某种方式更改它时,将struct成员声明为(指向)const对象以获取诊断信息有时很有用。而不是通过专门设计来维护该数据类型的功能。但是,在这些功能中,可能需要剥离const限定以更新这些成员。
当数据位于可堆叠的内存区域(如堆栈或堆)时,我们可以抛弃const。无论如何,我们需要小心,因为如果代码中继该数据是不可变的并且我们更改它,则可能会产生意外行为。
所以,这就是你要求的:
typedef enum {A1, A2} enum_A;
typedef struct { const enum_A G; } struct_B;
typedef struct { const struct_B * F; } struct_C;
typedef struct { const struct_C *E; } struct_D;
int main() {
const struct_B b = {A1};
const struct_C c = {&b};
const struct_D temp = {&c};
enum_A *pointer_to_non_const_A = &temp.E[0].F[0].G;
*pointer_to_non_const_A = A2;
}
但这取决于temp
的定义位置,并将导致编译警告。如果temp
是一个将崩溃的全球性。以下是工作时的情况,但不得使用,崩溃时:
#include <stdlib.h>
const int global_in_data_segment = 0;
int main() {
const int in_stack = 0;
static const int static_in_data_segment = 0;
const int *in_heap = malloc(sizeof(int));
int *works;
works = &in_stack; *works = 1;
works = in_heap; *works = 2;
int *crashes;
crashes = &global_in_data_segment; *crashes = 3;
crashes = &static_in_data_segment; *crashes = 4;
}
为了完整起见,c ++有const_cast:https://en.cppreference.com/w/cpp/language/const_cast