私はそのようにしています:
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 の付録にあります。
ここで何をしているかを分析してみましょう。
// 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;
Try using const
to indicate that the strings won't be modified.
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]);
}
}
Here, argc
will also be calculated at compile time automatically so there's a lesser chance of error (thanks to Goz for the suggestion).
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 スタイルの可変長配列を実装しているため、それらを使用しても何の不満もありませんが、移植可能なコードを書きたい場合は避けるのが最善です。
ヴラドに+1。
ここで何が起こるかについての私からの説明:
そのようなコードのため、「非推奨」の警告が表示されます。
"asdf"
現在はconst char*
ではなく のタイプがありchar*
ます。また、文字列リテラルを に変換して、それほど厳密ではないchar*
古い規則との互換性を維持することができます。ただし、文字列リテラルからfromconst
への変換は非推奨であり、それに依存するべきではありません。char*
const char*
なんで?文字列リテラルは定数メモリへのポインタであるため、const char*
.