【发布时间】:2011-07-08 23:40:19
【问题描述】:
我知道在 C 中你不能隐式转换,例如,char** 到 const char**(参见C-Faq、SO question 1、SO Question 2)。
另一方面,如果我看到这样声明的函数:
void foo(char** ppData);
我必须假设该函数可能会更改传入的数据。 因此,如果我正在编写一个不会更改数据的函数,我认为最好声明:
void foo(const char** ppData);
甚至:
void foo(const char * const * ppData);
但这会使该功能的用户处于尴尬的境地。 他们可能有:
int main(int argc, char** argv)
{
foo(argv); // Oh no, compiler error (or warning)
...
}
为了干净利落地调用我的函数,他们需要插入一个演员表。
我主要来自 C++ 背景,由于 C++ 更深入的 const 规则,这不是一个问题。
C 中的惯用解决方案是什么?
将 foo 声明为采用
char**,并仅记录它不会更改其输入的事实?这似乎有点恶心,尤其是。因为它会惩罚可能拥有const char**并希望传递它的用户(现在他们必须抛弃离开 const-ness)强制用户投射他们的输入,添加 const-ness。
还有别的吗?
【问题讨论】:
-
1)
const在 C 中是一个无用的编译器注解。 -
@Conrad:我不知道我是否会说没用,但它看起来确实有点...... gimpy
-
@jw:你可以把它扔掉,你可以把它扔到非常量的东西上……你可以让常量指针和非常量指针指向内存中的同一个对象——这是一个懦弱的编译器注释,只会阻止最愚蠢的意外使用。更棘手、更难检测的错误完全未被发现。
-
为了完整起见,根据您的链接之一,请注意,在 C++ 中,您应该能够强制转换 "char **" "char const * const *" 因为它不会违反这一点错误,所以这可能是理论上正确的声明函数的方法,如果你真的需要它。显然,如果您使用的是严格的 C,那将无济于事,但如果您将 C 与 C++ 混合使用,或者使用可以将其作为扩展打开的编译器(如果有的话?),这可能是一个足够的选择。