所以我应该使用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]
时,为什么我会使用所有这些让自己陷入困境?
答案 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];