繁体   English   中英

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

[英]how initialize char* const argv [] in 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)

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM