Typedef数组混淆

时间:2017-03-05 11:06:45

标签: c++ arrays 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 个答案:

答案 0 :(得分: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大小的数字视为源代码所称的{{1},这几乎没有可想而知的理由。 }}

如果至少它被称为string之类的东西;在这种情况下,char_arr8名称(可能)会使代码更具可读性,而不会引起混淆。

typedef

这段代码表明你真正想要做什么。您需要一个字符串容器并调用容器&#34; license_plates&#34;。没关系。只需使用int main(){ string license_plate[100] std::vector在C ++中表达它。

std::string

如果您完全确定容器将始终包含100个元素,那么然后就可以使用数组:

#include <string>
#include <vector>

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

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

std::array

答案 1 :(得分:2)

您为char[8]定义了一个类型别名。所以当你这样做的时候。

string license_place[100];

等同于

char license_place[100][8];