我有一个以字符串数组作为参数的函数:
int parseArguments(int argc, const char* const* argv);
我想将所有内容标记为
const
以允许此函数的任何输入参数,无论是否为常量。现在,我想用 main
的 argv
来调用这个函数:
int main(int argc, char** argv)
{
parseArguments(argc, (const char* const*)argv);
}
我知道将指针传递给需要指向 const 限定类型的指针的非限定类型是可以的(例如,将
char*
传递给期望 const char*
的函数)并且隐式转换不适用于嵌套指针(例如,将 char**
传递给期望 const char**
的函数会引发警告)。我也知道标准中解释原因的示例:
const char** cpp;
char* p;
const char c = ’A’;
cpp = &p; // constraint violation
*cpp = &c; // valid
*p = 0; // valid
// this code would end up modifying the value of a constant object
我认为它不适用于这里,因为我只是将嵌套指针传递给函数。
我想知道但在 C 标准中找不到的是,执行上面的显式转换以“添加嵌套 const 限定”是否是有效的操作,或者我是否必须执行以下操作:
size_t s = argc * sizeof(argv[0]);
const char** arr = malloc(s);
// error checking
memcpy(arr, argv, s);
我也可以直接定义
main
来具有常量参数 (int main(int argc, const char** argv)
),但我更愿意让我的程序严格遵守。
我认为这是标准中的一个缺陷,从
char **
的转换无法转换为 const char * const *
。
如标准示例所示,将
char **
值分配给 const char **
可能会导致修改 const
对象。 这种特殊情况下的问题是 const
限定符并未应用于每个指针“级别”,这将允许无效操作。
鉴于
const
限定符应用于示例中的每个级别,从 char **
到 const char * const *
的显式转换将不允许修改 const
限定对象,因此这可以被认为是安全的。