Tag: const

更改const指针的值

我有以下代码: void TestFunc(const void * const Var1,const float Var2) { *(float *)Var1 = Var2; } 看起来我正在改变const指针指向的const对象的值(感谢sharptooth),这是不允许的。 事实是,我试过的编译器都没有发出警告。 这怎么可能?

为什么使用const不允许变量大小的对象初始化

这是错误的,因为可能无法初始化可变大小的对象 int size = 4; int array[size] = {1}; size是一个变量,但是编译器在创建array时不知道它的值(在编译时是不是为size指定了初始值为4?)? 在此之后让size发生变化,为什么会出现问题呢? 我的意思是,这些是连续的指令,在声明数组之前可能会改变size的值? 第二个问题:为什么不允许这样做: const int size = 4; int array[size] = {1}; 我宣称size为常量。 我知道const!=只读,并且将宏size声明为正确的方法。 但是,如果我保证使用const的编译器,我不会改变size的值,为什么不允许?

什么时候const被认为是一个常量?

在阅读stackoverflow中的一些问题和答案时,我遇到了这个问题 我试图理解它,但答案很难理解,特别是像这样的术语 静态存储持续时间 在翻译阶段无法评估表达式 等等… 此外,我认为常量总是常量(这是我从学校学到的) 有人可以让它有点容易理解吗?

C:声明一个指向常量字符数组的常量指针

我试图理解数组声明,constness及其生成的变量类型。 允许以下内容(由我的编译器): char s01[] = “abc” ; // typeof(s01) = char* const char s02[] = “abc” ; // typeof(s02) = const char* (== char const*) char const s03[] = “abc” ; // typeof(s03) = char const* (== const char*) 或者,我们可以手动声明数组大小: char s04[4] = “abc” ; // typeof(s04) = char* const char s05[4] = “abc” ; […]

是否可以将int **和const int **替换为别名?

我的理解是这样的事情是可以的: const int ci = 42; const int *cip = &ci; int *ip = (int *)cip; int j = *ip; 那这个呢? const int ci = 42; const int *cip = &ci; const int **cipp = &cip; int **ipp = (int **)cipp; int j = **ipp;

带有const参数的函数指针是否可以用作带有nonconst参数的函数指针?

也许标题本身并不清楚……我有一个函数f(由某些库提供),它将一个函数指针作为参数作为签名void g(int*) ,即ie void f(void (*g)(int*)); 但是,我想使用函数g (我定义)和签名void g(const int*)来使用它。 先验,我无法看到这是如何违反任何const正确性的,因为f所有签名都表示g只会被一个(非const ) int* (非常量)调用,事实上我可以使用非const int*参数调用void (const int*)函数。 但海湾合作委员会抱怨并说, expected ‘void (*)(int *)’, but argument is of type ‘void (*)(const int *)’ 我看不出这个投诉是如何合法的,所以有人知道我对此的理解是否错误,或者是否有办法解决?

const为参数上的数组大小表达式

我有以下C代码示例: int f(const int farg[const 5]) { } 数组大小的附加const有什么作用? 当我省略const时有什么区别?

C中的const和指针

使用带指针的const可以通过使用有问题的指针解除引用,使得指针对象无法修改。 但为什么我也不能修改指针没有直接指向的东西? 例如: int a = 3; const int* ptr = &a; *ptr = 5; 不会编译。 但为什么呢 *(ptr + 2) = 5; 还没编译? 我没有改变指针指向的内容。 所以我们不得不说使用带有指针的const这样不仅使得指针指向的东西不可修改(通过解引用指针)而且还有其他任何东西,我们使用指针得到的地址是什么? 我知道在示例中我试图访问未分配的内存,但这只是为了讨论。

C中的“私有”结构成员与const

为了拥有一个干净的代码,使用一些OO概念可能是有用的,即使在C中。我经常编写由一对.h和.c文件组成的模块。 问题是模块的用户必须小心,因为C中不存在私有成员。使用pimpl习语或抽象数据类型是可以的,但是它添加了一些代码和/或文件,并且需要更重的代码。 我讨厌在不需要时使用访问器。 这是一个想法,它提供了一种方法,使编译器抱怨对“私有”成员的无效访问,只需要几个额外的代码。 我们的想法是定义两次相同的结构,但为模块的用户添加了一些额外的“const”。 当然,演员也可以写“私人”成员。 但重点是避免模块用户的错误,而不是安全地保护内存。 /*** 2DPoint.h module interface ***/ #ifndef H_2D_POINT #define H_2D_POINT /* 2D_POINT_IMPL need to be defined in implementation files before #include */ #ifdef 2D_POINT_IMPL #define _cst_ #else #define _cst_ const #endif typedef struct 2DPoint { /* public members: read and write for user */ int x; /* private members: […]

“const”是如何实现的?

编译器,C或C ++(例如,gcc)如何遵循const声明? 例如,在下面的代码中, 编译器如何跟踪变量ci是否为const且无法修改? int get_foo() { return 42; } void test() { int i = get_foo(); i += 5; const int ci = get_foo(); // ci += 7; // compile error: assignment of read-only variable ?ci? }