Tag: const

为什么在这里不会发生从非const到const的隐式转换?

可能重复: 为什么将(指向非const的指针)转换为(指向const的指针)是合法的 C中的双指针常量警告 我将gchar**传递给g_key_file_set_string_list ,它需要一个const gchar * const identifier [] /* this function is part of the GLib library */ void g_key_file_set_string_list(GKeyFile *key_file, const gchar *group_name, const gchar *key, const gchar * const list[], gsize length); const gchar **terms = malloc(sizeof(gchar*) * count); … … g_key_file_set_string_list(, , , terms, count); 和GCC 4.7.1的选项-std=c99 -pedantic给了我这个 警告:从不兼容的指针类型传递’g_key_file_set_string_list’的参数4 注意:预期’const […]

将int和const int转换为float时的结果不同

有人能够解释为什么int和const int在转换为float并在浮点数学中使用时给出不同的结果? 例如,参见这段代码: int _tmain(int argc, _TCHAR* argv[]) { int x = 1000; const int y = 1000; float fx = (float) x; float fy = (float) y; printf(“(int = 1000) * 0.3f = %4.10f \n”, 0.3f*x); printf(“(const int = 1000) * 0.3f = %4.10f \n”, 0.3f*y); printf(“(float)(int = 1000) * 0.3f = %4.10f \n”, […]

“volatile char *”类型的参数与“const char *”类型的参数不兼容

我有一个函数,其原型如下: void foo(const char * data); 在我的代码的其他地方,我有一个声明如下的全局变量 volatile char var[100]; 每当我尝试这样做: foo(var); 编译器抛出以下错误消息: “volatile char *”类型的参数与“const char *”类型的参数不兼容 为什么会这样? 据我了解,我的函数中的变量不允许更改指针或其内容。 我理解,因为我的全局变量是易变的,它可能随时发生变化,但看到拥有一个易变的const变量是完全合法的,我不明白为什么我得到这个编译器错误。 谢谢 –Amr

我可以将const char *数组传递给execv吗?

这是execv的原型: int execv(const char *path, char *const argv[]); 我可以传递一个const char指针数组作为第二个参数吗? 此示例程序在未设置USE_CAST时发出警告: #include int main(int argc, char *argv[]) { if (argc > 0) { const char *exe_name = “/bin/echo”, *message = “You ran”; const char *exe_args[] = { exe_name, message, argv[0], NULL }; #ifdef USE_CAST execv(“/bin/echo”, (char **) exe_args); #else execv(“/bin/echo”, exe_args); #endif } return 0; […]

这是否适合在C中使用const限定符?

我在C中有一个简单的向量实现,它包含一个void *数组。 由用户来决定实际类型。 我想’保证’向量不会改变其内容,所以我将数据存储为: Struct _Vector{ UInt32 used; UInt32 size; const void** arr; }; 我不知道它是否被认为是“过度使用”我的常量正确性,但我尝试用我的访问器/修饰符维护const正确性: void vector_add(Vector *v, const void* const elem); void vector_set(Vector *v, const UInt32 idx, const void* const elem); 当我从向量中返回一个元素时,它是一个指向用户数据的指针,因此我让用户通过丢弃内部数组中的常量来修改指向的数据。 void* vector_get(const Vector *v, const UInt32 idx){ if ( idx >= v->used ) exitAtError(“Vector”,”Array out of bounds”); return (void*)v->arr[idx]; } 而不是返回const void […]

当给定`const char *`作为第一个参数时,C标准库函数`strchr`如何返回指向非const的指针?

使用gcc / g ++编译给定代码示例成功。 strchr调用没有错误,这显然将const char *赋予char * 。 我发现strchr在两个不同的源pubs.opengroup.org和cplusplus.com上声明为char * strchr(const char *, int) 如果strchr被实现为抛弃strchr ,那为什么会这样呢? 如果目标是提供对char *和const char *字符串都有效的函数 – 它可以使用两个不同的函数名实现。 你能否对此作出更全面的解释? #include int main () { const char *str = “Sample string”; char * ptr; //ptr = str; // Error: discards const qualifier – both on gcc and g++ pch = strchr(str,’S’); […]

C:`const`关键字的行为

我被告知如果我在ANSI-C中编码以按照将使用变量的顺序声明,断言指针不是null并且索引在边界内,并且在使用变量之前初始化。 如果我声明一个const,我可以在一个断言和代码块后初始化它吗? 在Java中,最终的初始化必须在声明时进行,但是通过ANSI-C实现它是一致的,我可以初始化const一次但不一定在声明时?

为什么“char *”可以指向“const char *”?

可以在VC或gcc上正确编译以下代码: char *str = “I am a const!”; str[2] = ‘n’; 但是,显然存在运行时错误。 因为“我是一个常客!” 是一个const char *,为什么编译器不会给出错误甚至是警告? 此外,如果我定义char a[] = “I am const!” ,a中的所有元素都可以修改,为什么这次字符串文字变得不nonconst ?

C中的const变量的数组大小

我发现了一个有趣的事实,我不明白它是如何运作的。 以下代码完美无缺。 #include int main(){ const int size = 10; int sampleArray[size]; typedef char String [size]; return 0; } 然后,我尝试只使用具有全局范围的常量变量,并且它仍然很好。 #include const int size = 10; int main(){ int sampleArray[size]; typedef char String [size]; return 0; } 但是,如果我将数组的范围也改为全局,我得到以下结果: 错误:在文件范围内修改了’sampleArray’ #include const int size = 10; int sampleArray[size]; typedef char String [size]; int main(){ return 0; […]

const数组const {}

所以你可以这样做: void foo(const int * const pIntArray, const unsigned int size); 这表示指针是只读的,它指向的整数是只读的。 你可以像这样访问函数内部: blah = pIntArray[0] 您还可以执行以下声明: void foo(const int intArray[], const unsigned int size); 它几乎是一样的,但你可以这样做: intArray = &intArray[1]; 我可以写: void foo(const int const intArray[], const unsigned int size); 那是对的吗?