如何在c ++中初始化char * const argv []

时间:2015-03-30 04:17:26

标签: c++ c

API函数采用类型为'char * const argv []'的参数 我在我的c ++应用程序中初始化这种类型的参数,如:

char* const  argv[] = {"--timeout=0", NULL}; 

并将参数传递给API函数,如:

Spawner spawner;
spawner.execute (argv, true);

使用g ++编译器,我得到以下错误:

error: deprecated conversion from string constant to 'char*' [-Werror=write-strings]

如何摆脱上述错误?

以下是API中执行函数的声明:

void Spawner::execute (char *const argv[], bool bShowChildWindow)

3 个答案:

答案 0 :(得分:4)

除了禁用基础警告-Werror或完全禁用警告外,您可以执行以下操作:

char arg0[] = "--timeout=0";
char* const  argv[] = {arg0, NULL};

在这种情况下,字符串用作数组初始值设定项;没有指向它的指针。

答案 1 :(得分:3)

是的,C ++对const chars非常(但正确)严格。试试这个

char timeoutString[] = "--timeout=0";    // make a non-const char array
char *argv[] = { timeoutString, NULL };
Spawner spawner;
spawner.execute( argv, true );

从技术上讲,问题在于execute方法的声明,它应该是

void Spawner::execute (const char *const argv[], bool bShowChildWindow)

假设execute没有修改字符串或数组。

答案 2 :(得分:0)

char* const  argv[] = {"--timeout=0", NULL}; 

声明argv是指向const的{​​{1}}指针数组。它不是指向char char。

的指针

您可以在更简单的声明中看到错误:

const

可以使用以下方法之一修复:

char* s = "foo";

char const* s = "foo"; // Points to the read-only memory char* s[] = "foo"; // Makes a copy of the read-only memory 所需的内容之一是:

argv

char argv1[][50] = {"--timeout=0"}; 
char* argv[] = {argv1[0], NULL}; 

并将char argv1[] = "--timeout=0"; char* argv[] = {argv1, NULL}; 传递给argv

如果您不希望编译器使用这些产生错误,您可以使用Spawner::execute。但是,如果你这样做,你将会在薄冰上行走。您最终可能会意外修改只读内存并导致未定义的行为。