前言:
学习从来都不是单调的,从书本学来的永远都是游离于水面的浮游,只有从实践中去摸索和感受,才能加深理解,才能记忆更加的深刻,这也是为什么我在进入MFC学习阶段还会回过头来做C++基础的笔记。因为在学习MFC的过程中,能够加强我对C++的理解,一个Struct并不是字面上的结构体那么简单,通过看到不理解,然后自己亲自去花时间实践,并得出自己的结论,这就是一个学习的过程。
全文基于该大神解析
https://www.cnblogs.com/qyaizs/articles/2039101.html
代码部分
#main.cpp
extern "C" {
#include "structs.h"
}
using namespace std;
struct StuMaqi {
string name;
} mQ = {"mQ"};
//直接申明的结构体变量
struct {
char * name;
} NULLS_;
//调用
typedef myStru_ myStru__;
myStru__ myStru;
myStru.iNum = 98;
myStru.lLength = 99;
mQ.name = "mQ_";
cout << "mQ_.name==" << mQ.name << endl;
char nulls_[] = "NULLS_";
NULLS_.name =nulls_;
cout << NULLS_.name << "**************" << NULLS_.name << endl;
StuSer user;
char username[] = "C++user";
user.name = username;
cout << "******user.name *********" << user.name << endl;
tagMyStruct varName;
varName.iNum = 100;
varName.lLength = 101;
MyStruct aStruct;
aStruct.iNum = 102;
aStruct.lLength = 103;
tagMyStruct tagStruc;
tagStruc.iNum = 104;
tagStruc.lLength = 105;
cout << "******myStru__*********" << endl;
cout << myStru.iNum << "**************" << myStru.lLength << endl;
cout << "******tagMyStruct*********" << endl;
cout << varName.iNum << "**************" << varName.lLength << endl;
cout << "******aStruct*********" << endl;
cout << aStruct.iNum << "**************" << aStruct.lLength << endl;
cout << "******tagStruc*********" << endl;
cout << tagStruc.iNum << "**************" << tagStruc.lLength << endl;
shwoStruc();
structs.h
typedef struct tagMyStruct {
int iNum;
long lLength;
} MyStruct;
// multiple definition of `uSer'
//struct StuSer {
// const char *name;
//} uSer = {"mQ"};
struct StuSer {
char *name;
} StuE;
//直接申明的结构体变量
struct {
char * nULLSname;
} NULLS;
typedef struct {
int iNum;
long lLength;
} MyStruct2, myStru_;
void shwoStruc();
structs.c
#include <stdio.h>
#include <stdlib.h>
#include "structs.h"
void shwoStruc() {
//error: unknown type name 'tagMyStruct'
// tagMyStruct asdas;
struct tagMyStruct newTagStrcu;
newTagStrcu.iNum = 1000001;
newTagStrcu.lLength = 1000002;
MyStruct aStruct__;
aStruct__.iNum = 1000009;
aStruct__.lLength = 1000010;
typedef MyStruct aStruct_;
aStruct_ aStruct;
aStruct.iNum = 1000003;
aStruct.lLength = 1000004;
typedef myStru_ myStru__;
myStru__ myStru;
myStru.lLength = 1000005;
myStru.lLength = 1000006;
typedef MyStruct2 myStru___;
myStru___ myStrus;
myStrus.lLength = 1000007;
myStrus.lLength = 1000008;
struct StuSer user;
user.name = "user";
NULLS.nULLSname = "NULLS";
printf("****** aStruct__*********\n");
printf("****** iNum = %d lLength = %d*********\n", aStruct__.iNum, aStruct__.lLength);
printf("****** newTagStrcu*********\n");
printf("****** iNum = %d lLength = %d*********\n", newTagStrcu.iNum, newTagStrcu.lLength);
printf("****** aStruct*********\n");
printf("****** iNum = %d lLength = %d*********\n", aStruct.iNum, aStruct.lLength);
printf("****** myStru*********\n");
printf("****** iNum = %d lLength = %d*********\n", myStru.iNum, myStru.lLength);
printf("****** myStrus*********\n");
printf("****** iNum = %d lLength = %d*********\n", myStrus.iNum, myStrus.lLength);
printf("****** user*********\n");
printf("****** name = %s \n", user.name);
printf("****** NULLS.nULLSname = %s \n", NULLS.nULLSname);
}
输出:
mQ_.name==mQ_
NULLS_**************NULLS_
******user.name *********C++user
******myStru__*********
98**************99
******tagMyStruct*********
100**************101
******aStruct*********
102**************103
******tagStruc*********
104**************105
****** aStruct__*********
****** iNum = 1000009 lLength = 1000010*********
****** newTagStrcu*********
****** iNum = 1000001 lLength = 1000002*********
****** aStruct*********
****** iNum = 1000003 lLength = 1000004*********
****** myStru*********
****** iNum = 1878006336 lLength = 1000006*********
****** myStrus*********
****** iNum = 2686536 lLength = 1000008*********
****** user*********
****** name = user
****** NULLS.nULLSname = NULLS
总结:
1.在C和C++中都适用
typedef struct structTagName{
}valueName;
struct structName{
}
typedef struct{
} structName, structName;
只在C++适用 :这里的mQ就是变量名,也可以初始化
struct structName{
string name;
} mQ = {"mQ"};
//当在C中则报错: multiple definition of `mQ'
但是可以只申明StuE这个变量
struct StuSer {
char *name;
} StuE;
C/C++类似 但用法不同:注意一个有typeof 一个没有,只是写法类似。
//在C中 表示的都是结构体
typedef struct structTagName{
} structName, structName;
//在C++ ','后面表示的都是变量名
struct structName{
} structName, valueName;
//用法上:
//C:
//structTagName必须加上struct关键字
struct tagMyStruct newTagStrcu;
//structName
MyStruct aStruct;
//或者加上 typedef
typedef MyStruct aStruct_;
aStruct_ aStruct;
//C++中:
//直接使用 struct可加可不加
tagMyStruct varName;
//对于structTagName和structName区别不明显 如下:
tagMyStruct tagStruc;
MyStruct aStruct;
C与C++用法总结
在C中,这个申明后申请结构变量的方法有两种:
(1)struct tagMyStruct 变量名
(1-1) typedef myStru_ myStru__;
myStru__ myStru;
(2)MyStruct 变量名
在c++中可以有
(1)struct tagMyStruct 变量名
(2)MyStruct 变量名
(3)tagMyStruct 变量名
最后还有个结构体变量,顾名思义 就是个变量。
struct {
char * nULLSname;
} NULLS;
个人经验总结:
struct structName{}valueName
valueName就是变量名
typedef struct {} structName, structName;
structName都是类型名 需要初始化
typedef struct tagStructName {} valueName;
valueName 就是变量名
tagStructName 需要使用struct初始化如:
struct tagStructName valueName;
//直接申明的结构体变量
struct { } valueName;
然而 对于C++以上情况,除了完美继承之外,统统可以视为一种情况即:
tagStructName valueName 都可直接作为类型名,初始化变量。
除此之外C++默认支持初始化 如:
struct structName{
string name;
} mQ = {"mQ"};
ps:以上就是个人对于C/C++ Struct的全部理解,感觉个人总结的比较粗糙,想进一步加强理解就直接将代码拷贝过去,试着删除struct 或者添加个typeof ,然后自己运行一遍,什么都明白了。