【发布时间】:2016-06-09 08:38:42
【问题描述】:
我在尝试编写 const 正确代码时偶然发现了一个小问题。
我本来想写一个函数,它接受一个指向 const 结构的指针,告诉编译器“请告诉我是否正在修改结构,因为我真的不想”。
我突然想到编译器会允许我这样做:
struct A
{
char *ptrChar;
};
void f(const struct A *ptrA)
{
ptrA->ptrChar[0] = 'A'; // NOT DESIRED!!
}
这是可以理解的,因为实际上 const 是指针本身,而不是它指向的类型。我希望编译器告诉我,我正在做一些我不想做的事情,如果可能的话。
我使用 gcc 作为我的编译器。虽然我知道上面的代码应该是合法的,但我还是检查了它是否会发出警告,但没有任何反应。我的命令行是:
gcc -std=c99 -Wall -Wextra -pedantic test.c
是否有可能解决这个问题?
【问题讨论】:
-
此案例适用于成员的分配。例如
ptrA->ptrChar = malloc(2);不是指哪个成员。 -
为此,我通常有一个头文件,它只是向前声明
struct a;,而a_do_something(const struct *a);中的一些函数声明很少需要在头文件中包含struct A的整个定义。您将很多函数(例如f)放在单独的翻译单元中,其中f只会以某种方式使用 ptrAstuff = a_do_something(ptrA);
标签: c constants compiler-warnings c99