2017-03-05 132 views
1

所以我應該做一個程序,使用typedef命令在數組中存儲不同的車牌。我的朋友通過我的代碼,但我沒有真正得到他的解釋。這是他的代碼:Typedef陣列混淆

#include <iostream> 
using namespace std; 

typedef char string[8] 

...functions functions... 

int main(){ 
    string license_plate[100] 

... 

我有點困惑剛纔發生在這裏。我知道typedef是關於什麼的,但從未真正在數組中看到它。從我的理解

typedef char string[8] 

意味着,每當我寫string[8]編譯器使得它成爲char代替。

但是這對我沒有意義,爲什麼我會輸入[8]呢?所以我認爲這是他留下的一個錯誤,並刪除了[8],它編譯沒有錯誤。

所以我想問一下,是不是真的可以說我的修正string license_plate[100]變得無非就是char license_plate[100]給編譯器的眼睛呢?如果是這樣的話,爲什麼我只能輸入char license_plate[100]來使用所有這一切呢?

+2

要麼不要」不要使用名稱空間標準;(我建議)或不要命名你的類型字符串。記住有一個標準的字符串類'std :: string'。 –

+0

你應該用這種方式制定問題http://stackoverflow.com/questions/ask/advice?有更多機會獲得答案。否則,'typedef'用於爲現有類型提供替代名稱。 – 2017-03-05 11:10:13

回答

3
typedef char string[8] 

這行代碼是一個可怕的想法。它告訴編譯器將名稱string視爲等效於char[8]

最糟糕的是,你已經無望地混淆了自己,未來的代碼讀者和編譯器本身,因爲已經有了標準的std::string類。

例子:

#include <string> 
#include <iostream> 

int main() 
{ 
    typedef char string[8]; // terrible idea 

    // ... 

    string x("abc"); 
    std::cout << x.size() << '\n'; // error 
    std::cout << (x + "def") << '\n'; // error 
    std::getline(std::cin, x); // error 
} 

這種混亂是由您使用using namespace std;的事實變得更加可怕。不要使用它。幫你一個忙,只需要用std::來預先考慮一切。

另一個可怕的方面你typedef的是,幾乎沒有一個可以想象的原因,你爲什麼會想治療八大系列char尺度的序號的一些東西,在源代碼中調用string

如果至少它被稱爲類似char_arr8;在這種情況下,名稱將(可能)使代碼更具可讀性,而不會造成混淆。

int main(){ 
    string license_plate[100] 

這段代碼表明你真的做什麼。您需要一個字符串容器並調用容器「license_plates」。沒關係。只需使用std::vectorstd::string即可在C++中表達它。

#include <string> 
#include <vector> 

int main() { 
    std::vector<std::string> license_plates; 
    // ... 
} 

如果你有絕對的把握,容器將始終保持正好是100元,然後你可以使用一個數組:

#include <string> 

int main() { 
    std::string license_plates[100]; 
    // ... 
} 

或者std::array

#include <string> 
#include <array> 

int main() { 
    std::array<std::string, 100> license_plates; 
    // ... 
} 
2

您爲char[8]定義了一個類型別名。所以當你這樣做時

string license_place[100]; 

它相當於

char license_place[100][8];