为什么我不能正常初始化 typedef struct string 或 char?
Why can't I initialize a typedef struct string or char as normally?
我是编程和 C++ 的初学者。
在 Linux 上编程,我正在创建一个 typedef 结构,如下所示:
typedef struct {
char id[10];
string name[20];
}Employee;
通常,当不使用 struct 时,我会初始化 string char 做:
char id[10]="ID02093";
string name="Joe";
那么,为什么我不能如下初始化 Employee 结构的字符 ID 和字符串名称?:
Employee salesManager;
salesManager.id="ID02093";
salesManager.name="Joe";
我从 g++ 编译器中得到这个错误:
"incompatible types in assignment of ‘const char [8]’ to ‘char [9]’
salesManager.id="ID02093";" incompatible types in assignment of ‘const
char [4]’ to ‘std::__cxx11::string [20] {aka
std::__cxx11::basic_string [20]}’ salesManager.name="Joe";
从 typedef 结构声明中初始化 typedef 结构元素的字符串和字符的正确方法是什么?
我认为你应该在这两种情况下都使用字符串,并使用 OOP 而不是 typedef。但是试试下面的代码,应该可以正常工作:
#include <iostream>
using namespace std;
typedef struct {
string id;
string name;
} Employee;
int main() {
Employee salesManager;
salesManager.id = "A12345678";
salesManager.name = "Test";
cout << "Id: " << salesManager.id << endl;
cout << "Name: " << salesManager.name << endl;
return 0;
}
初始化和赋值是两个不同(但相似)的东西。
您可以在 declare/define 时通过为其提供值来初始化数组。
不能给数组赋值。
您可以使用 memcpy
或 strcpy
:
将值复制 到数组中
char name[20];
strcpy(name, "Test";
但为了您的目的,您可以将数组初始化为结构初始化的一部分:
typedef struct {
char id[10];
char name[20];
} Employee;
Employee salesManager = {
"A12345678",
"Test"
};
/* OR */
Employee salesManager = {
.id = "A12345678",
.name = "Test"
};
由于您询问的是 C++ 而不是 C,因此最好使用 std::string
而不是原始字符数组。 std::string
更加灵活:您可以将值(包括字符串文字)分配给 std::string
对象。
您不能分配给 char
的数组
考虑这一行:
salesManager.id="ID02093";
您可以使用字符串文字来初始化 char
的数组,作为从 C 继承的语法 C++ 所允许的便利。但是,您不能对数组使用赋值。这就是您收到此错误的原因:
incompatible types in assignment of ‘const char [8]’ to ‘char [9]’ salesManager.id="ID02093";
相反,您必须将数据复制到数组中。
您不能分配给 string
的数组
考虑这一行
salesManager.name="Joe";
失败的原因是您已将 name
也声明为数组。
typedef struct {
char id[10];
string name[20];
}Employee;
这解释了您收到此错误的原因:
incompatible types in assignment of ‘const char [4]’ to ‘std::__cxx11::string [20] {aka std::__cxx11::basic_string [20]}’ salesManager.name="Joe";
您可能并不想将 name
声明为数组。
避免使用匿名 classes
给匿名 class 类型的 typedef
名称与 class 名称的语义略有不同。由于差异很棘手,如果 class 本身不包含在 class 中,最好避免使用匿名 classes。
我是编程和 C++ 的初学者。
在 Linux 上编程,我正在创建一个 typedef 结构,如下所示:
typedef struct {
char id[10];
string name[20];
}Employee;
通常,当不使用 struct 时,我会初始化 string char 做:
char id[10]="ID02093";
string name="Joe";
那么,为什么我不能如下初始化 Employee 结构的字符 ID 和字符串名称?:
Employee salesManager;
salesManager.id="ID02093";
salesManager.name="Joe";
我从 g++ 编译器中得到这个错误:
"incompatible types in assignment of ‘const char [8]’ to ‘char [9]’ salesManager.id="ID02093";" incompatible types in assignment of ‘const char [4]’ to ‘std::__cxx11::string [20] {aka std::__cxx11::basic_string [20]}’ salesManager.name="Joe";
从 typedef 结构声明中初始化 typedef 结构元素的字符串和字符的正确方法是什么?
我认为你应该在这两种情况下都使用字符串,并使用 OOP 而不是 typedef。但是试试下面的代码,应该可以正常工作:
#include <iostream>
using namespace std;
typedef struct {
string id;
string name;
} Employee;
int main() {
Employee salesManager;
salesManager.id = "A12345678";
salesManager.name = "Test";
cout << "Id: " << salesManager.id << endl;
cout << "Name: " << salesManager.name << endl;
return 0;
}
初始化和赋值是两个不同(但相似)的东西。
您可以在 declare/define 时通过为其提供值来初始化数组。
不能给数组赋值。
您可以使用 memcpy
或 strcpy
:
char name[20];
strcpy(name, "Test";
但为了您的目的,您可以将数组初始化为结构初始化的一部分:
typedef struct {
char id[10];
char name[20];
} Employee;
Employee salesManager = {
"A12345678",
"Test"
};
/* OR */
Employee salesManager = {
.id = "A12345678",
.name = "Test"
};
由于您询问的是 C++ 而不是 C,因此最好使用 std::string
而不是原始字符数组。 std::string
更加灵活:您可以将值(包括字符串文字)分配给 std::string
对象。
您不能分配给 char
的数组
考虑这一行:
salesManager.id="ID02093";
您可以使用字符串文字来初始化 char
的数组,作为从 C 继承的语法 C++ 所允许的便利。但是,您不能对数组使用赋值。这就是您收到此错误的原因:
incompatible types in assignment of ‘const char [8]’ to ‘char [9]’ salesManager.id="ID02093";
相反,您必须将数据复制到数组中。
您不能分配给 string
的数组
考虑这一行
salesManager.name="Joe";
失败的原因是您已将 name
也声明为数组。
typedef struct { char id[10]; string name[20]; }Employee;
这解释了您收到此错误的原因:
incompatible types in assignment of ‘const char [4]’ to ‘std::__cxx11::string [20] {aka std::__cxx11::basic_string [20]}’ salesManager.name="Joe";
您可能并不想将 name
声明为数组。
避免使用匿名 classes
给匿名 class 类型的 typedef
名称与 class 名称的语义略有不同。由于差异很棘手,如果 class 本身不包含在 class 中,最好避免使用匿名 classes。