今天看这边《C 专家编程》 在其中看到了typedef 这个关键字, 其实以前我也知道他,都还在用。一直都是用在struct 的前面,只知道用他之后,struct 的变量可以直接声明, 而不需要加struct 。 只知其然,不知其所以然。今天看到这样2 句代码:
- typedef char * string;
- string punchline = "I'm a frayed knot";
以为当时在教室,所以就记下来,也没太在意。就在刚才,无聊的我,就决定来试试!不试不知道,一式吓一跳。开始的时候怎么都不成功。因为我创建的CPP 文件。 所以,我就决定给他添加一个 #include <string> 来试试。 因为我写的代码是:
- typedef char * string;
- string s = "i am a student";
然后他就报错在第一句那个位置,后来我将其改成String 后,他又不错了, 只提示一个警告。不过已经能够编译运行了!
后来,我又将#include <string> 去掉,结果也能运行了,但是警告还在。我猜,估计又是编译器在抽风,后来我不管怎么去修改他都没问题了。只是警告依然: warning: deprecated conversion from string constant to 'char*' ;
然后我就百度了,查处结果是char *背后的含义是:给我个字符串,我要修改它。
所以在其前面加一个 const 就OK
- typedef const char *Str;
因为这里的char * 的内容,我们是没办法更改的, 所以最合理的方式是对其加一个const ,意思是:给我个字符串,我只读他。
- #include <iostream>
- // #include <string>
- using namespace std;
- typedef const char *Str;
- int main()
- {
- Str s = "i am a student";
- cout<<s<<endl;
- return 0;
- }
上面的代码是正确的,0 error, 0 warning
- #include <iostream>
- // #include <string>
- using namespace std;
- typedef char *Str;
- int main()
- {
- Str s ;
- cin>>s;
- cout<<s<<endl;
- return 0;
- }
上面的代码是错误的,因为Str 只是 char * 的替代品。就类似于一个人的绰号。所以他的实际意义还是跟char * 是一个意思。所以,在使用他的时候,如果是数组必须先进行动态分配空间!