我这样做:
int argc = 9;
char* argv[argc];
argv[0] = "c:/prog.exe";
但我注意到它已被弃用。有什么更好的方法?
答案 0 :(得分:1)
你必须要使它成为const:
const char *argv[] = { "Arg1", "Arg2", "..." };
...或者不使用常量字符串文字:
int argc = 9;
char* argv[argc];
char prog_name[] = "c:/prog.exe";
argv[0] = prog_name;
答案 1 :(得分:1)
除了为数组大小使用常量表达式之外的其他东西的问题......
已弃用的东西是将字符串文字静默转换为char*
。过去没问题:
char * hello = "hello";
现在必须是:
char const* hello = "hello";
这个弃用实际上是在C ++ 03的附录中。
答案 2 :(得分: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
也将在编译时自动计算,因此出错的可能性较小(感谢Goz的建议)。
答案 3 :(得分: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;
答案 4 :(得分:0)
+1。
我在这里发生的更多解释:
您收到“已弃用”警告,因为此类代码:
"asdf"
现在有const char*
类型,而不是char*
。并且字符串文字可以转换为char*
,以便在const
不那么严格时保留与旧约定的一些兼容性。但是,不推荐将字符串文字从char*
转换为const char*
,您不应该依赖它。
为什么呢?字符串文字是指向常量内存的指针,这就是它需要const char*
的原因。
答案 5 :(得分:0)
除了其他人已经指出的const字符串文字被分配给非const char指针以及在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风格的可变长度数组,因此在使用它们时可能不会引起任何抱怨,但如果您想编写可移植代码,最好避免使用它们。