2010-12-14 70 views
1

我做這樣的說法:C++我怎麼能正確預定義的char *數組?

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

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

,但我得到的通知,它已被棄用。什麼是更好的方法?

+2

這實際上是無效的c + +。使用變量來聲明堆棧中數組的大小是新的C標準的一部分,該標準尚未與最新的C++集成。你確定你使用了正確的標籤嗎? – 2010-12-14 20:21:42

+0

@Noah Roberts:這可能是編譯器實現的一種語言擴展(這可能解釋了爲什麼它被棄用)。 – 2010-12-14 20:25:49

+0

就標準而言,不是「一體化」的。但主要的編譯器支持這一點,所以我會順利在這一個(這不是順便說一句OP的問題)。 – Kos 2010-12-14 20:25:50

回答

1

你必須要麼使其常量:

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

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

int argc = 9; 
char* argv[argc]; 
char prog_name[] = "c:/prog.exe"; 
argv[0] = prog_name; 
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也將在編譯時會自動所以有錯誤的機會較少(感謝戈茲貝達的建議)計算。

+0

中的標準棄用根據體系結構(指針大小),sizeof(argv)不會是(典型值)4還是8? – 2010-12-14 20:20:30

+0

「const int argc = sizeof(argv)/ sizeof(argv [0]);」意味着一個錯誤的可能性會降低一點:) – Goz 2010-12-14 20:21:33

+0

@Mark B:是的。我有一個腦屁。 :-P @Goz:謝謝,我已經將其添加到我的答案中。 – 2010-12-14 20:23:28

1

除了使用其他的東西比一個常量表達式的問題你數組大小...

已棄用的東西是將字符串文字無聲地轉換爲char*。這曾經是OK:

char * hello = "hello"; 

現在它必須是:

char const* hello = "hello"; 

這棄用實際上是在C++ 03的附錄。

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; 
0

+1弗拉德。

從我什麼在這裏發生的一些更多的解釋:

你得到了 「過時」 的警告,因爲這樣的代碼:

"asdf" 

現在有型const char*,不char*。當const不是那麼嚴格時,字符串文字可以轉換爲char*,以保持與舊協議的兼容性。但是,將字符串文字從const char*轉換爲char*已被棄用,您不應該依賴它。

爲什麼?字符串文字是指向常量內存的指針,這就是爲什麼它需要是const char*

0

除了其他人指出的有關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風格變長數組,所以當你使用它們,你可能不會得到任何投訴,但如果你想他們仍然是最好的避免編寫便攜式代碼。