我做这样的说法:C++我怎么能正确预定义的char *数组?
int argc = 9;
char* argv[argc];
argv[0] = "c:/prog.exe";
,但我得到的通知,它已被弃用。什么是更好的方法?
我做这样的说法:C++我怎么能正确预定义的char *数组?
int argc = 9;
char* argv[argc];
argv[0] = "c:/prog.exe";
,但我得到的通知,它已被弃用。什么是更好的方法?
你必须要么使其常量:
const char *argv[] = { "Arg1", "Arg2", "..." };
...或不使用常量字符串文字:
int argc = 9;
char* argv[argc];
char prog_name[] = "c:/prog.exe";
argv[0] = prog_name;
尝试使用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
也将在编译时会自动所以有错误的机会较少(感谢戈兹贝达的建议)计算。
中的标准弃用根据体系结构(指针大小),sizeof(argv)不会是(典型值)4还是8? – 2010-12-14 20:20:30
“const int argc = sizeof(argv)/ sizeof(argv [0]);”意味着一个错误的可能性会降低一点:) – Goz 2010-12-14 20:21:33
@Mark B:是的。我有一个脑屁。 :-P @Goz:谢谢,我已经将其添加到我的答案中。 – 2010-12-14 20:23:28
除了使用其他的东西比一个常量表达式的问题你数组大小...
已弃用的东西是将字符串文字无声地转换为char*
。这曾经是OK:
char * hello = "hello";
现在它必须是:
char const* hello = "hello";
这弃用实际上是在C++ 03的附录。
让分析你在这里做什么:
// 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;
+1弗拉德。
从我什么在这里发生的一些更多的解释:
你得到了 “过时” 的警告,因为这样的代码:
"asdf"
现在有型const char*
,不char*
。当const
不是那么严格时,字符串文字可以转换为char*
,以保持与旧协议的兼容性。但是,将字符串文字从const char*
转换为char*
已被弃用,您不应该依赖它。
为什么?字符串文字是指向常量内存的指针,这就是为什么它需要是const char*
。
除了其他人指出的有关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风格变长数组,所以当你使用它们,你可能不会得到任何投诉,但如果你想他们仍然是最好的避免编写便携式代码。
这实际上是无效的c + +。使用变量来声明堆栈中数组的大小是新的C标准的一部分,该标准尚未与最新的C++集成。你确定你使用了正确的标签吗? – 2010-12-14 20:21:42
@Noah Roberts:这可能是编译器实现的一种语言扩展(这可能解释了为什么它被弃用)。 – 2010-12-14 20:25:49
就标准而言,不是“一体化”的。但主要的编译器支持这一点,所以我会顺利在这一个(这不是顺便说一句OP的问题)。 – Kos 2010-12-14 20:25:50