Tag: const

常量对象的常量数组

如何在C(而不是C ++)中定义常量对象的常量数组? 我可以定义 int const Array [] = { /* init data here */ }; 但这是一个非常数对象的非常数。 我可以用 int const * const Array = { /* init data here */ }; 它可能会奏效。 但是有可能用数组语法做到这一点吗? (看起来更干净)

C / C ++宏而不是const

宏#define MAX 80相当于const int MAX = 80; 两者都是常数,不能修改。 使用宏而不是常量整数不是更好吗? 常量整数占用内存。 预处理器将宏的名称替换为它的值,对吧? 所以它不会记忆。 为什么我会使用const int而不是宏?

为什么我得到关于初始化器不是常数的错误?

我使用以下代码。 const int X_ORIGIN = 1233086; const int Y_ORIGIN = -4728071; const int Z_ORIGIN = 4085704; const int xyzOrigin[NUM_DIMENSIONS] = {X_ORIGIN, Y_ORIGIN, Z_ORIGIN}; 当我编译它时,GCC给我以下错误。 Transformations.h:16:1:错误:初始化元素不是常量 那是什么意思? 我该如何修复我的代码?

可以抛弃constness导致未定义的行为?

const int a = 10 int *p = (int*) &a; *p = 20; printf(“a = %d”, a); 是否可以输出10或20,具体取决于编译器?

是否为永远不会使用地址的静态const变量分配内存?

如果我从不使用静态const变量的地址,那么在使用合理的现代编译器时是否为它分配了内存?

C中的指针到const转换

以下代码在GCC上编译时没有警告,但在Visual Studio 2005中发出警告。 const void * x = 0; char * const * p = x; x指向未知类型的常量对象,p指向char的常量指针。 为什么p的赋值会导致警告? 同样,这是C,而不是C ++。 谢谢。

为什么在传递参数时使用const会给我一个警告?

为什么这段代码会给我一个警告:从不兼容的指针类型传递“test”的参数1? 我知道这是关于char之前的const,但为什么呢? void test(const int ** a) { } int main() { int a=0; int *b=&a; int **c=&b; test(c); return 0; }

为什么我们允许更改“const”限定变量的值?为什么指针允许这样做,但不允许赋值?

考虑以下2个程序prog1和prog2。如果我尝试使用指针ptr更改const限定变量i的值,我得到警告(而不是错误) “initialization discards qualifiers from pointer target type|” ,但程序运行然后显示新值。但是如果我尝试使用赋值语句在第二个程序中更改i的值,我得到assignment of read-only variable ‘i’|的错误 (不是警告) assignment of read-only variable ‘i’| 。 以下是此前提产生的混淆: 1)为什么我们允许在任何情况下更改只读const限定变量的值?它是否会破坏使用const限定符的目的?如果我们尝试这样做,我们不应该得到错误吗? 2)即使由于一些奇怪的原因我们被允许更改常量值,为什么在使用指针(允许,带警告)和使用赋值更改只读const限定变量的值之间进行区分操作(根本不允许,并给我们一个错误)? //prog1 #include int main () { const int i=8; int *ptr=&i; *ptr=9; printf(“%d”,*ptr); //Prints new value nevertheless } 警告:初始化从指针目标类型中丢弃限定符 //prog2 #include int main() { const int i=8; i=10; printf(“%d”,i); } 错误:分配只读变量’i’| 编辑H2CO3 […]

C ++数组大小声明和const

我只是跳进C ++,来自C 在C(89/90)中, const实际上不是常量(与# #define , enum或literal相反),而是一旦设置为只读。 即,我可以: const int x = rand(); 这很好 – 直到运行时才知道x的点。 因此,我不能 int arr[x]; // error – x is not a compile-time constant 然后,C标准之一(99?)继续进行并允许可变长度数组。 虽然我通常使用C语言中的ANSI标准进行编码,但实际上这已经产生了影响,因为我正在尝试拾取C ++ 11。 据我所知,C ++不允许使用可变长度数组。 但是,许多编译器允许它作为扩展(GCC?)。 问题是,现在我正在尝试学习C ++ 11,我无法判断我编写的是有效的C ++,还是C ++扩展的C99兼容性。 例如: std::default_random_engine e{}; std::uniform_int_distribution d{}; const int x{d(e)}; int arr[x]; // compiles 我不知道这是否是有效的C ++。 显然,直到运行时才知道x的值。 […]

可以/为什么在返回类型中使用char *而不是const char *会导致崩溃?

我在某处读到如果你想要一个C / C ++函数来返回一个字符数组(而不是std :: string),你必须返回const char *而不是char *。 执行后者可能会导致程序崩溃。 有人能够解释这是否属实? 如果是真的,为什么从一个如此危险的函数返回一个char *? 谢谢。 const char * my_function() { …. } void main(void) { char x[] = my_function(); }