2017-03-05 91 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];