1

我是这样做的:

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

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

但我注意到它已被弃用。什么是更好的方法?

4

6 回答 6

1

您必须将其设为 const:

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

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

int argc = 9;
char* argv[argc];
char prog_name[] = "c:/prog.exe";
argv[0] = prog_name;
于 2010-12-14T20:22:33.457 回答
1

除了对数组大小使用常量表达式以外的其他东西的问题......

已弃用的是将字符串文字静默转换为char*. 这曾经是好的:

char * hello = "hello";

现在它必须是:

char const* hello = "hello";

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

于 2010-12-14T20:25:21.193 回答
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 的建议)。

于 2010-12-14T20:16:02.677 回答
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;
于 2010-12-14T20:25:25.137 回答
0

+1 弗拉德。

我对这里发生的事情的更多解释:

您会收到“已弃用”警告,因为这样的代码:

"asdf"

现在有类型const char*,没有char*。并且字符串文字可以转换为,以在不那么严格char*的情况下保留与旧约定的一些兼容性。const但是不推荐将字符串文字转换为char*from const char*,您不应该依赖它。

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

于 2010-12-14T20:28:04.953 回答
0

除了其他人指出的关于将 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 风格的可变长度数组,因此在使用它们时您可能不会收到任何抱怨,但如果您想编写可移植代码,最好避免使用它们。

于 2010-12-14T20:32:10.900 回答