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)
答案 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
。但是,如果你这样做,你将会在薄冰上行走。您最终可能会意外修改只读内存并导致未定义的行为。