我是这样做的:
int argc = 9;
char* argv[argc];
argv[0] = "c:/prog.exe";
但我注意到它已被弃用。什么是更好的方法?
我是这样做的:
int argc = 9;
char* argv[argc];
argv[0] = "c:/prog.exe";
但我注意到它已被弃用。什么是更好的方法?
您必须将其设为 const:
const char *argv[] = { "Arg1", "Arg2", "..." };
...或不使用常量字符串文字:
int argc = 9;
char* argv[argc];
char prog_name[] = "c:/prog.exe";
argv[0] = prog_name;
除了对数组大小使用常量表达式以外的其他东西的问题......
已弃用的是将字符串文字静默转换为char*
. 这曾经是好的:
char * hello = "hello";
现在它必须是:
char const* hello = "hello";
这种弃用实际上在 C++03 的附录中。
尝试使用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 的建议)。
让我们分析一下你在这里做什么:
// 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*
。并且字符串文字可以转换为,以在不那么严格char*
的情况下保留与旧约定的一些兼容性。const
但是不推荐将字符串文字转换为char*
from const char*
,您不应该依赖它。
为什么?字符串文字是一个指向常量内存的指针,这就是为什么它需要是const char*
.
除了其他人指出的关于将 const 字符串文字分配给非 const char 指针以及在 main() 的参数列表之外声明 argv 和 argc 的奇怪之处之外,此行还有一个额外的问题:
char* argv[argc];
在 C++ 中,您只能对数组大小使用整数常量表达式;一个整数常量表达式,它是程序源代码中的一个字面整数(如“5”或“10”),一个枚举值(如“enum colors {red, green, blue};”中的“red”),一个 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 风格的可变长度数组,因此在使用它们时您可能不会收到任何抱怨,但如果您想编写可移植代码,最好避免使用它们。