2010-12-14 36 views
1

我做这样的说法:C++我怎么能正确预定义的char *数组?

int argc = 9; 
char* argv[argc]; 

argv[0] = "c:/prog.exe"; 

,但我得到的通知,它已被弃用。什么是更好的方法?

+2

这实际上是无效的c + +。使用变量来声明堆栈中数组的大小是新的C标准的一部分,该标准尚未与最新的C++集成。你确定你使用了正确的标签吗? – 2010-12-14 20:21:42

+0

@Noah Roberts:这可能是编译器实现的一种语言扩展(这可能解释了为什么它被弃用)。 – 2010-12-14 20:25:49

+0

就标准而言,不是“一体化”的。但主要的编译器支持这一点,所以我会顺利在这一个(这不是顺便说一句OP的问题)。 – Kos 2010-12-14 20:25:50

回答

1

你必须要么使其常量:

const char *argv[] = { "Arg1", "Arg2", "..." }; 

...或不使用常量字符串文字:

int argc = 9; 
char* argv[argc]; 
char prog_name[] = "c:/prog.exe"; 
argv[0] = prog_name; 
0

尝试使用const来指示字符串不会被修改。

const char* argv[] = { "c:/prog.exe" }; 
const int argc = sizeof(argv)/sizeof(argv[0]); 

int main() 
{ 
    for(int i = 0; i < argc; ++i) 
    { 
     ::printf("%s\n", argv[i]); 
    } 
} 

这里,argc也将在编译时会自动所以有错误的机会较少(感谢戈兹贝达的建议)计算。

+0

中的标准弃用根据体系结构(指针大小),sizeof(argv)不会是(典型值)4还是8? – 2010-12-14 20:20:30

+0

“const int argc = sizeof(argv)/ sizeof(argv [0]);”意味着一个错误的可能性会降低一点:) – Goz 2010-12-14 20:21:33

+0

@Mark B:是的。我有一个脑屁。 :-P @Goz:谢谢,我已经将其添加到我的答案中。 – 2010-12-14 20:23:28

1

除了使用其他的东西比一个常量表达式的问题你数组大小...

已弃用的东西是将字符串文字无声地转换为char*。这曾经是OK:

char * hello = "hello"; 

现在它必须是:

char const* hello = "hello"; 

这弃用实际上是在C++ 03的附录。

0

让分析你在这里做什么:

// Create an int with value 9. 
int argc = 9; 

// Create an array of char* pointers of size 9 
char* argv[argc]; 

// Assign the the first pointer to the global data string "C:\prog.exe" 
argv[0] = "c:/prog.exe"; 

我的猜测是,你是不是想做什么,我上面描述。尝试是这样的:

// create an array of characters 
char argv[] = "C:/prog.exe"; 

// argc in now the length of the string 
int argc = sizeof argv; 

- 或 -

// create an array of strings 
char* argv[] = {"C:/prog.exe"}; 
// argc is now the number of strings in the array 
int argc = 1; 
0

+1弗拉德。

从我什么在这里发生的一些更多的解释:

你得到了 “过时” 的警告,因为这样的代码:

"asdf" 

现在有型const char*,不char*。当const不是那么严格时,字符串文字可以转换为char*,以保持与旧协议的兼容性。但是,将字符串文字从const char*转换为char*已被弃用,您不应该依赖它。

为什么?字符串文字是指向常量内存的指针,这就是为什么它需要是const char*

0

除了其他人指出的有关const字符串文字被分配给非常量字符指针以及在main()的参数列表之外声明argv和argc的古怪之外,这条线还有一个问题这里:

char* argv[argc];

只能用于数组大小整数常量表达式在C++;整数常量表达式是程序源代码中的文字整数(例如“5”或“10”),枚举值(如“枚举颜色{红色,绿色,蓝色};”中的“红色”),sizeof表达,或者用const声明int变量:

// can hold 30 ints 
int myarray1[30]; 

// can hold as many ints as myarray1 is wide in bytes 
int myarray2[sizeof(myarray1)]; 

// C++ does not support variable-length arrays like C99 does, so if an int 
// variable is used to specify array size, it must be marked const: 
const int myarray3_size = 42; 
int myarray3[myarray3]; 

许多C++编译器实现了C99风格变长数组,所以当你使用它们,你可能不会得到任何投诉,但如果你想他们仍然是最好的避免编写便携式代码。