我做這樣的說法: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