Tag: const

25:警告:初始化元素不是常量表达式

GCC在尝试编译时给出了以下警告消息: las.c:13:18: warning: initializer element is not a constant expression [enabled by default] const int ROWS = pow (2, MESH_K); 相关的代码部分是: #define MESH_K 10 #define BUFF_SIZE 30 const int ROWS = pow (2, MESH_K); 我需要在代码的后续点使用MESH_K和ROWS。 我理解函数调用可能导致GCC认为这不是一个常量表达式。 然而,鉴于对pow的调用本质上是一个常量,是否有更好的方法来实现它(可能是预处理器宏?)并消除警告? 我不介意在这部分代码中牺牲性能的可读性,因此欢迎任何和所有复杂的解决方案。

从指向const的指针中删除const是否遵循C中的严格别名,并引用相同的对象?

C中的以下代码是否定义了行为? int main() { const int i = 0; return *(int*)(&i); } 我问因为6.5 / 7列出了“与对象的有效类型兼容的类型的合格版本”作为有效别名。 但是对象的有效类型是const int ,我不认为int是const int的限定版本(尽管反之亦然)。 int和const int都不兼容(6.7.3 / 10)。 此外,6.3.2.3 / 2表示您可以通过添加限定符来转换指针类型,并且结果指针是相等的。 6.3.2.3/7表示你可以转换任何两种指针类型(因此允许使用cast (int*)(&i)本身)。 但是并没有说结果指针指的是同一个对象,甚至它是相等的。 它说的是它可以转换回原始类型(在本例中为const int* )。 也就是说,即使别名是合法的,我也不清楚标准是否保证我的指针转换确实会导致指向i的指针。 那么,标准是否实际上定义了我的代码的行为,如果是这样,这个定义在哪里? 我知道代码在实践中有效。 我想到了一个假设的(和奇怪的)实现,它不起作用。 我可以问这个实现是否符合标准(如果没有,它违反了哪个部分),但如果还有其他方面,我想象的实现无法符合,我不想浑水。 如果有人认为这将有助于他们回答问题,我将描述实施。

是否未定义行为抛弃函数参数的常量?

想象一下,我有这个C函数(以及头文件中的相应原型) void clearstring(const char *data) { char *dst = (char *)data; *dst = 0; } 在上面的代码中是否存在未定义的行为, 将const掉 ,或者它只是一个非常糟糕的编程实践? 假设没有使用const限定对象 char name[] = “pmg”; clearstring(name);

strchr实现如何工作

我试着编写自己的strchr()方法实现。 它现在看起来像这样: char *mystrchr(const char *s, int c) { while (*s != (char) c) { if (!*s++) { return NULL; } } return (char *)s; } 最后一行原来是 return s; 但这不起作用,因为s是const。 我发现需要这个演员(char *),但老实说我不知道​​我在那里做什么:(有人可以解释一下吗?

在C&C ++中使用const限定符指向数组的指针

考虑以下计划: int main() { int array[9]; const int (*p2)[9] = &array; } 它在C ++中编译良好(参见此处的实时演示)但在C中编译失败。默认情况下,GCC会发出以下警告。 (见此处的现场演示)。 prog.c: In function ‘main’: prog.c:4:26: warning: initialization from incompatible pointer type [enabled by default] const int (*p2)[9] = &array; 但如果我使用-pedantic-errors选项: gcc -Os -s -Wall -std=c11 -pedantic-errors -o constptr constptr.c 它给了我以下编译器错误 constptr.c:4:26: error: pointers to arrays with different qualifiers are incompatible […]

C中的const与C ++中的const

给定的代码在C中编译但在C ++中失败。 int main() { const int x; /* uninitialized const compiles in C but fails in C++*/ } 从C到C ++的变化背后有什么理由和原因?

为什么我可以更改const char *变量的值?

为什么C中的以下代码有效? const char* str = NULL; str = “test”; str = “test2”; 由于str是指向常量字符的指针,为什么我们允许为它分配不同的字符串文字? 此外,我们如何保护str不被修改? 例如,如果我们稍后将str分配给更长的字符串,最后写入另一部分内存,那么这似乎是一个问题。 我应该补充一点,在我的测试中,我在每个作业之前和之后打印出str的内存地址,但它从未改变过。 因此,尽管str是指向const char的指针,但内存实际上正在被修改。 我想知道这可能是C的遗留问题吗?

const指针有什么用(与指向const对象的指针相对)?

我经常使用const对象的指针,就像这样…… const int *p; 这只是意味着你不能通过p改变p指向的整数。 但是我也看到了const指针的引用,这样宣称…… int* const p; 据我所知,这意味着指针变量本身是不变的 – 你可以改变它整天指向的整数,但你不能指出其他东西。 有什么可能的用途?

为清晰起见,是否应使用返回类型的无用类型限定符?

当我们在头文件中有原型时,我们的静态分析工具会抱怨“返回类型上无用的类型限定符”,例如: const int foo(); 我们这样定义它是因为函数返回一个永远不会改变的常量,认为API似乎更清晰。 我觉得这类似于为了清楚明确地将全局变量初始化为零,即使C标准已经声明如果未明确初始化所有全局变量将被初始化为零。 在一天结束时,它真的没关系。 (但静态分析工具并没有抱怨。) 我的问题是,有什么理由可以导致问题吗? 我们是否应该忽略该工具产生的错误,或者我们是否应该以不太清晰和一致的API的可能成本来安抚该工具? (它返回该工具没有问题的其他const char*常量。)

constness和指针指针

我对const关键字非常困惑。 我有一个函数接受一个字符串数组作为输入参数和一个接受可变数量的参数的函数。 void dtree_joinpaths(char* output_buffer, int count, …); void dtree_joinpaths_a(char* output_buffer, int count, const char** paths); dtree_joinpaths在从参数列表构建了一个字符串数组后,在内部调用dtree_joinpaths_a 。 void dtree_joinpaths(char* output_buffer, int count, …) { int i; va_list arg_list; va_start(arg_list, count); char** paths = malloc(sizeof(char*) * count); for (i=0; i < count; i++) { paths[i] = va_arg(arg_list, char*); } va_end(arg_list); dtree_joinpaths_a(output_buffer, count, paths); } 但是gcc编译器给了我以下错误消息: […]