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

3

一个 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中execute函数的声明:

void Spawner::execute (char *const argv[], bool bShowChildWindow)
3个回答

4

除了禁用底层警告的-Werror,或完全禁用该警告以外,您还可以执行以下操作:

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

在这种情况下,该字符串作为数组初始化器使用;它并不涉及任何指向它的指针。

4

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

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 不会修改字符串或数组。

@hmb 非常好,很高兴能够帮助 :) - user3386109

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

声明argv为指向charconst指针数组。它不是指向const char的指针。

您可以在更简单的语句中看到错误:

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

如果您不希望编译器对此产生错误,可以使用-Wno-write-strings。但是,如果这样做,您将处于危险之中。您可能会意外地修改只读内存并导致未定义的行为。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接