typedef用法 typedef的用法

\u6570\u636e\u7ed3\u6784\u4e2d typedef struct \u7528\u6cd5

\u5728C\u8bed\u8a00\u4e2d\uff0c\u53ef\u4ee5\u4f7f\u7528\u7ed3\u6784\u4f53\uff08Struct\uff09\u6765\u5b58\u653e\u4e00\u7ec4\u4e0d\u540c\u7c7b\u578b\u7684\u6570\u636e\u3002\u7ed3\u6784\u4f53\u7684\u5b9a\u4e49\u5f62\u5f0f\u4e3a\uff1a
struct \u7ed3\u6784\u4f53\u540d\uff5b
\u7ed3\u6784\u4f53\u6240\u5305\u542b\u7684\u53d8\u91cf\u6216\u6570\u7ec4
\uff5d\uff1b
\u7ed3\u6784\u4f53\u662f\u4e00\u79cd\u96c6\u5408\uff0c\u5b83\u91cc\u9762\u5305\u542b\u4e86\u591a\u4e2a\u53d8\u91cf\u6216\u6570\u7ec4\uff0c\u5b83\u4eec\u7684\u7c7b\u578b\u53ef\u4ee5\u76f8\u540c\uff0c\u4e5f\u53ef\u4ee5\u4e0d\u540c\uff0c\u6bcf\u4e2a\u8fd9\u6837\u7684\u53d8\u91cf\u6216\u6570\u7ec4\u90fd\u79f0\u4e3a\u7ed3\u6784\u4f53\u7684\u6210\u5458\uff08Member\uff09\u3002
\u7ed3\u6784\u4f53\u5b9a\u4e49\uff1a
\u7b2c\u4e00\u79cd\uff1a\u53ea\u6709\u7ed3\u6784\u4f53\u5b9a\u4e49
struct stuff\uff5b
char job\uff3b20\uff3d\uff1b
int age\uff1b
float height\uff1b
\uff5d\uff1b
\u7b2c\u4e8c\u79cd\uff1a\u9644\u52a0\u8be5\u7ed3\u6784\u4f53\u7c7b\u578b\u7684\u201c\u7ed3\u6784\u4f53\u53d8\u91cf\u201d\u7684\u521d\u59cb\u5316\u7684\u7ed3\u6784\u4f53\u5b9a\u4e49
\uff0f\uff0f\u76f4\u63a5\u5e26\u53d8\u91cf\u540dHuqinwei
struct stuff\uff5b
char job\uff3b20\uff3d\uff1b
int age\uff1b
float height\uff1b
\uff5dHuqinwei\uff1b
\u4e5f\u8bb8\u521d\u671f\u770b\u4e0d\u4e60\u60ef\u5bb9\u6613\u56f0\u60d1\uff0c\u5176\u5b9e\u8fd9\u5c31\u76f8\u5f53\u4e8e\uff1a
struct stuff\uff5b
char job\uff3b20\uff3d\uff1b
int age\uff1b
float height\uff1b
\uff5d\uff1b
struct stuff Huqinwei\uff1b
\u7b2c\u4e09\u79cd\uff1a\u5982\u679c\u8be5\u7ed3\u6784\u4f53\u53ea\u7528\u4e00\u4e2a\u53d8\u91cfHuqinwei\uff0c\u800c\u4e0d\u518d\u9700\u8981\u7528struct stuff yourname\uff1b\u53bb\u5b9a\u4e49\u7b2c\u4e8c\u4e2a\u53d8\u91cf\u3002
\u90a3\u4e48\uff0c\u9644\u52a0\u53d8\u91cf\u521d\u59cb\u5316\u7684\u7ed3\u6784\u4f53\u5b9a\u4e49\u8fd8\u53ef\u8fdb\u4e00\u6b65\u7b80\u5316\u51fa\u7b2c\u4e09\u79cd\uff1a
struct\uff5b
char job\uff3b20\uff3d\uff1b
int age\uff1b
float height\uff1b
\uff5dHuqinwei\uff1b
\u628a\u7ed3\u6784\u4f53\u540d\u79f0\u53bb\u6389\uff0c\u8fd9\u6837\u66f4\u7b80\u6d01\uff0c\u4e0d\u8fc7\u4e5f\u4e0d\u80fd\u5b9a\u4e49\u5176\u4ed6\u540c\u7ed3\u6784\u4f53\u53d8\u91cf\u4e86\u2014\u2014\u81f3\u5c11\u6211\u73b0\u5728\u6ca1\u638c\u63e1\u8fd9\u79cd\u65b9\u6cd5\u3002
\u7ed3\u6784\u4f53\u53d8\u91cf\u53ca\u5176\u5185\u90e8\u6210\u5458\u53d8\u91cf\u7684\u5b9a\u4e49\u53ca\u8bbf\u95ee\u3002
\u8981\u5206\u6e05\u7ed3\u6784\u4f53\u53d8\u91cf\u548c\u7ed3\u6784\u4f53\u5185\u90e8\u6210\u5458\u53d8\u91cf\u7684\u6982\u5ff5\u3002
\u5c31\u50cf\u521a\u624d\u7684\u7b2c\u4e8c\u79cd\u63d0\u5230\u7684\uff0c\u7ed3\u6784\u4f53\u53d8\u91cf\u7684\u58f0\u660e\u53ef\u4ee5\u7528\uff1a
struct stuff yourname\uff1b
\u5176\u6210\u5458\u53d8\u91cf\u7684\u5b9a\u4e49\u53ef\u4ee5\u968f\u58f0\u660e\u8fdb\u884c\uff1a struct stuff Huqinwei \uff1d \uff5b\uff02manager\uff02\uff0c30\uff0c185\uff5d\uff1b
\u4e5f\u53ef\u4ee5\u8003\u8651\u7ed3\u6784\u4f53\u4e4b\u95f4\u7684\u8d4b\u503c\uff1a
struct stuff faker \uff1d Huqinwei\uff1b
\uff0f\uff0f\u6216 struct stuff faker2\uff1b
\uff0f\uff0f faker2 \uff1d faker\uff1b
\u6253\u5370\uff0c\u53ef\u89c1\u7ed3\u6784\u4f53\u7684\u6bcf\u4e00\u4e2a\u6210\u5458\u53d8\u91cf\u4e00\u6a21\u4e00\u6837
\u5982\u679c\u4e0d\u4f7f\u7528\u4e0a\u8fb9\u4e24\u79cd\u65b9\u6cd5\uff0c\u90a3\u4e48\u6210\u5458\u6570\u7ec4\u7684\u64cd\u4f5c\u4f1a\u7a0d\u5fae\u9ebb\u70e6\uff08\u7528for\u5faa\u73af\u53ef\u80fd\u597d\u70b9\uff09
Huqinwei\uff0ejob\uff3b0\uff3d \uff1d \uff07M\uff07\uff1b
Huqinwei\uff0ejob\uff3b1\uff3d \uff1d \uff07a\uff07\uff1b
Huqinwei\uff0eage \uff1d 27\uff1b
Huqinwei\uff0eheight \uff1d 185\uff1b
\u7ed3\u6784\u4f53\u6210\u5458\u53d8\u91cf\u7684\u8bbf\u95ee\u9664\u4e86\u53ef\u4ee5\u501f\u52a9\u7b26\u53f7"."\uff0c\u8fd8\u53ef\u4ee5\u7528"->"\u8bbf\u95ee\u3002

\u6269\u5c55\u8d44\u6599\uff1a
\u7ed3\u6784\u4f53\u6570\u7ec4\u4e0e\u7ed3\u6784\u4f53\u6307\u9488\uff1a
\u4e00\u4e2a\u7ed3\u6784\u4f53\u53d8\u91cf\u4e2d\u53ef\u4ee5\u5b58\u653e\u4e00\u7ec4\u6570\u636e\uff1b\u5982\u4e00\u4e2a\u5b66\u751f\u7684\u5b66\u53f7\u3001\u59d3\u540d\u3001\u6210\u7ee9\u7b49\u6570\u636e\u3002\u5982\u679c\u670910\u4e2a\u5b66\u751f\u7684\u6570\u636e\u9700\u8981\u53c2\u52a0\u8fd0\u7b97\u663e\u7136\u5e94\u8be5\u7528\u6570\u7ec4\uff0c\u8fd9\u5c31\u662f\u7ed3\u6784\u4f53\u6570\u7ec4\u7ed3\u6784\u4f53\u6570\u7ec4\u4e0e\u4ee5\u524d\u4ecb\u7ecd\u8fc7\u7684\u6570\u503c\u578b\u6570\u7ec4\u4e0d\u540c\u4e4b\u5904\uff1a\u6bcf\u4e2a\u6570\u7ec4\u5143\u7d20\u90fd\u662f\u4e00\u4e2a\u7ed3\u6784\u4f53\u7c7b\u578b\u7684\u6570\u636e\uff0c\u5b83\u4eec\u90fd\u5206\u522b\u5305\u62ec\u5404\u4e2a\u6210\u5458\uff08\u5206\u91cf\uff09\u9879\u3002
\u7ed3\u6784\u4f53\u6307\u9488\u548c\u5176\u4ed6\u7c7b\u578b\u7684\u6307\u9488\u90fd\u662f\u4e00\u6837\u7684\u7406\u89e3\uff0c\u572832\u4f4d\u5e73\u53f0\u4e0d\u7ba1\u5565\u7c7b\u578b\u7684\u6307\u9488\u90fd\u53604\u4e2a\u5b57\u8282\u7684\u7a7a\u95f4\u3002
\u7ed3\u6784\u4f53\u6307\u9488\u5c31\u662f\u6307\u5411\u7ed3\u6784\u4f53\u53d8\u91cf\u7684\u6307\u9488\uff1b\u5982\u679c\u4e00\u4e2a\u6307\u9488\u53d8\u91cf\u4e2d\u4fdd\u5b58\u4e86\u7ed3\u6784\u4f53\u53d8\u91cf\u7684\u9996\u5730\u5740\uff0c\u90a3\u4e48\u8fd9\u4e2a\u6307\u9488\u53d8\u91cf\u5c31\u6307\u5411\u8be5\u7ed3\u6784\u4f53\u53d8\u91cf\uff0e\u901a\u8fc7\u7ed3\u6784\u4f53\u6307\u9488\u5373\u53ef\u8bbf\u95ee\u8be5\u7ed3\u6784\u4f53\u53d8\u91cf\uff0c\u8fd9\u4e0e\u6570\u7ec4\u6307\u9488\u548c\u51fd\u6570\u6307\u9488\u7684\u60c5\u51b5\u662f\u76f8\u540c\u7684\u7ed3\u6784\u6307\u9488\u53d8\u91cf\u8bf4\u660e\u7684\u4e00\u822c\u5f62\u5f0f\u4e3a\uff1a
struct \u7ed3\u6784\u4f53\u540d *\u7ed3\u6784\u4f53\u6307\u9488\u53d8\u91cf\u540dstruct student *p = &Boy; //\u5047\u8bbe\u4e8b\u5148\u5b9a\u4e49\u4e86 struct student Boy\u3002
\u53c2\u8003\u8d44\u6599\u6765\u6e90\uff1a
\u767e\u5ea6\u767e\u79d1-struct

\u5728C\u8bed\u8a00\u7684\u60c5\u51b5\u4e0b\uff0c\u4e0eC++\u7a0d\u6709\u51fa\u5165\u3002typedef\u5728\u7ed3\u6784\u4f53\u5b9a\u4e49\uff0c\u8fd8\u6709\u4e00\u4e9b\u6570\u7ec4\u7b49\u5730\u65b9\u90fd\u5927\u91cf\u7684\u7528\u5230\u3002\u5f52\u7eb3\u4e00\u4e0b: \u3000\u3000\u6765\u6e90\u4e00:Using typedef to Curb Miscreant Code \u3000\u3000Typedef \u58f0\u660e\u6709\u52a9\u4e8e\u521b\u5efa\u5e73\u53f0\u65e0\u5173\u7c7b\u578b\uff0c\u751a\u81f3\u80fd\u9690\u85cf\u590d\u6742\u548c\u96be\u4ee5\u7406\u89e3\u7684\u8bed\u6cd5\u3002\u4e0d\u7ba1\u600e\u6837\uff0c\u4f7f\u7528 typedef \u80fd\u4e3a\u4ee3\u7801\u5e26\u6765\u610f\u60f3\u4e0d\u5230\u7684\u597d\u5904\uff0c\u901a\u8fc7\u672c\u6587\u4f60\u53ef\u4ee5\u5b66\u4e60\u7528 typedef \u907f\u514d\u7f3a\u6b20\uff0c\u4ece\u800c\u4f7f\u4ee3\u7801\u66f4\u5065\u58ee\u3002 \u3000\u3000typedef \u58f0\u660e\uff0c\u7b80\u79f0 typedef\uff0c\u4e3a\u73b0\u6709\u7c7b\u578b\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u540d\u5b57\u3002\u6bd4\u5982\u4eba\u4eec\u5e38\u5e38\u4f7f\u7528 typedef \u6765\u7f16\u5199\u66f4\u7f8e\u89c2\u548c\u53ef\u8bfb\u7684\u4ee3\u7801\u3002\u6240\u8c13\u7f8e\u89c2\uff0c\u610f\u6307 typedef \u80fd\u9690\u85cf\u7b28\u62d9\u7684\u8bed\u6cd5\u6784\u9020\u4ee5\u53ca\u5e73\u53f0\u76f8\u5173\u7684\u6570\u636e\u7c7b\u578b\uff0c\u4ece\u800c\u589e\u5f3a\u53ef\u79fb\u690d\u6027\u548c\u4ee5\u53ca\u672a\u6765\u7684\u53ef\u7ef4\u62a4\u6027\u3002\u672c\u6587\u4e0b\u9762\u5c06\u7aed\u5c3d\u5168\u529b\u6765\u63ed\u793a typedef \u5f3a\u5927\u529f\u80fd\u4ee5\u53ca\u5982\u4f55\u907f\u514d\u4e00\u4e9b\u5e38\u89c1\u7684\u9677\u9631\u3002 \u3000\u3000\u5982\u4f55\u521b\u5efa\u5e73\u53f0\u65e0\u5173\u7684\u6570\u636e\u7c7b\u578b\uff0c\u9690\u85cf\u7b28\u62d9\u4e14\u96be\u4ee5\u7406\u89e3\u7684\u8bed\u6cd5? \u3000\u3000\u4f7f\u7528 typedef \u4e3a\u73b0\u6709\u7c7b\u578b\u521b\u5efa\u540c\u4e49\u5b57\u3002 \u3000\u3000\u5b9a\u4e49\u6613\u4e8e\u8bb0\u5fc6\u7684\u7c7b\u578b\u540d \u3000\u3000typedef \u4f7f\u7528\u6700\u591a\u7684\u5730\u65b9\u662f\u521b\u5efa\u6613\u4e8e\u8bb0\u5fc6\u7684\u7c7b\u578b\u540d\uff0c\u7528\u5b83\u6765\u5f52\u6863\u7a0b\u5e8f\u5458\u7684\u610f\u56fe\u3002\u7c7b\u578b\u51fa\u73b0\u5728\u6240\u58f0\u660e\u7684\u53d8\u91cf\u540d\u5b57\u4e2d\uff0c\u4f4d\u4e8e ''typedef'' \u5173\u952e\u5b57\u53f3\u8fb9\u3002\u4f8b\u5982\uff1a \u3000\u3000typedef int size; \u3000\u3000\u6b64\u58f0\u660e\u5b9a\u4e49\u4e86\u4e00\u4e2a int \u7684\u540c\u4e49\u5b57\uff0c\u540d\u5b57\u4e3a size\u3002\u6ce8\u610f typedef \u5e76\u4e0d\u521b\u5efa\u65b0\u7684\u7c7b\u578b\u3002\u5b83\u4ec5\u4ec5\u4e3a\u73b0\u6709\u7c7b\u578b\u6dfb\u52a0\u4e00\u4e2a\u540c\u4e49\u5b57\u3002\u4f60\u53ef\u4ee5\u5728\u4efb\u4f55\u9700\u8981 int \u7684\u4e0a\u4e0b\u6587\u4e2d\u4f7f\u7528 size\uff1a \u3000\u3000void measure(size * psz); \u3000\u3000size array[4]; \u3000\u3000size len = file.getlength(); \u3000\u3000std::vector vs; \u3000\u3000typedef \u8fd8\u53ef\u4ee5\u63a9\u9970\u590d\u5408\u7c7b\u578b\uff0c\u5982\u6307\u9488\u548c\u6570\u7ec4\u3002\u4f8b\u5982\uff0c\u4f60\u4e0d\u7528\u8c61\u4e0b\u9762\u8fd9\u6837\u91cd\u590d\u5b9a\u4e49\u6709 81 \u4e2a\u5b57\u7b26\u5143\u7d20\u7684\u6570\u7ec4\uff1a \u3000\u3000char line[81]; \u3000\u3000char text[81]; \u3000\u3000\u5b9a\u4e49\u4e00\u4e2a typedef\uff0c\u6bcf\u5f53\u8981\u7528\u5230\u76f8\u540c\u7c7b\u578b\u548c\u5927\u5c0f\u7684\u6570\u7ec4\u65f6\uff0c\u53ef\u4ee5\u8fd9\u6837\uff1a \u3000\u3000typedef char Line[81]; \u3000\u3000Line text, secondline; \u3000\u3000getline(text); \u3000\u3000\u540c\u6837\uff0c\u53ef\u4ee5\u8c61\u4e0b\u9762\u8fd9\u6837\u9690\u85cf\u6307\u9488\u8bed\u6cd5\uff1a \u3000\u3000typedef char * pstr; \u3000\u3000int mystrcmp(pstr, pstr); \u3000\u3000\u8fd9\u91cc\u5c06\u5e26\u6211\u4eec\u5230\u8fbe\u7b2c\u4e00\u4e2a typedef \u9677\u9631\u3002\u6807\u51c6\u51fd\u6570 strcmp()\u6709\u4e24\u4e2a\u2018 const char *'\u7c7b\u578b\u7684\u53c2\u6570\u3002\u56e0\u6b64\uff0c\u5b83\u53ef\u80fd\u4f1a\u8bef\u5bfc\u4eba\u4eec\u8c61\u4e0b\u9762\u8fd9\u6837\u58f0\u660e mystrcmp()\uff1a \u3000\u3000int mystrcmp(const pstr, const pstr); \u3000\u3000\u7528GNU\u7684gcc\u548cg++\u7f16\u8bd1\u5668\uff0c\u662f\u4f1a\u51fa\u73b0\u8b66\u544a\u7684\uff0c\u6309\u7167\u987a\u5e8f\uff0c\u2018const pstr'\u88ab\u89e3\u91ca\u4e3a\u2018char* const\u2018\uff08\u4e00\u4e2a\u6307\u5411 char \u7684\u5e38\u91cf\u6307\u9488\uff09\uff0c\u800c\u4e0d\u662f\u2018char *'\uff08\u6307\u5411char \u7684\u6307\u9488\uff09\u3002\u8fd9\u4e2a\u95ee\u9898\u5f88\u5bb9\u6613\u89e3\u51b3\uff1a \u3000\u3000typedef const cpstr; \u3000\u3000int mystrcmp(cpstr, cpstr); // \u73b0\u5728\u662f\u6b63\u786e\u7684 \u3000\u3000\u8bb0\u4f4f\uff1a\u4e0d\u7ba1\u4ec0\u4e48\u65f6\u5019\uff0c\u53ea\u8981\u4e3a\u6307\u9488\u58f0\u660e typedef\uff0c\u90a3\u4e48\u90fd\u8981\u5728\u6700\u7ec8\u7684 typedef \u540d\u79f0\u4e2d\u52a0\u4e00\u4e2a const\uff0c\u4ee5\u4f7f\u5f97\u8be5\u6307\u9488\u672c\u8eab\u6240\u6307\u5bf9\u8c61\u4e0d\u4f1a\u901a\u8fc7\u6307\u9488\u88ab\u4fee\u6539\u3002 \u3000\u3000\u94fe\u8868\u4e2d\u7684\u5927\u6982\u5e94\u7528 \u3000\u3000name \u4fdd\u5b58\u5728\u7ed3\u6784\u4f53\u5355\u5143\u7684name[20] \u6570\u7ec4\u91cc; \u3000\u3000typedef struct node \u3000\u3000{ \u3000\u3000char name[20]; \u3000\u3000struct node *link; \u3000\u3000}stu; \u8fd9\u662f\u524d\u9762\u5b9a\u4e49\u7684\u7ed3\u6784\u4f53\u53d8\u91cf\uff0c\u4e00\u4e2a\u5355\u5143\u5305\u542b\u4e24\u4e2a\u90e8\u5206\uff0c\u4e00\u4e2a\u7528\u6765\u5b58\u50a8name\u7684\u6570\u7ec4name[20],\u4e00\u4e2a\u7528\u6765\u5b58\u653e\u4e0b\u4e00\u4e2a\u5355\u5143\u5730\u5740\u7684\u6307\u5411\u7ed3\u6784\u4f53node\u7684\u6307\u9488\u3002\u5047\u8bbe\u8be5\u5355\u5143\u7684\u5730\u5740\u662fp,\u90a3\u4e48p->name \u8868\u793a\u7b2c\u4e00\u90e8\u5206name[20]\u7684\u5730\u5740\uff0cp->link\u8868\u793a\u7b2c\u4e8c\u90e8\u5206\uff0c\u4f5c\u7528\u662f\u5b58\u653e\u4e0b\u4e00\u4e2a\u5355\u5143\u7684\u5730\u5740

typedef用法:

1、用typedef为现有类型创建别名,定义易于记忆的类型名

2、typedef 还可以掩饰复合类型,如指针和数组。

例如,你不用像下面这样重复定义有 81 个字符元素的数组:

只需这样定义,Line类型即代表了具有81个元素的字符数组,使用方法如下:

同样,可以像下面这样隐藏指针语法:

typedef是在计算机编程语言中用来为复杂的声明定义简单的别名,它与宏定义有些差异。它本身是一种存储类的关键字,与auto、extern、mutable、static、register等关键字不能出现在同一个表达式中。

扩展资料

typedef 有另外一个重要的用途,那就是定义机器无关的类型,例如,你可以定义一个叫 REAL 的浮点类型,在目标机器上它可以获得最高的精度:

typedef long double REAL;

在不支持 long double 的机器上,该 typedef 看起来会是下面这样:

typedef double REAL;

并且,在连 double 都不支持的机器上,该 typedef 看起来会是这样:

typedef float REAL;

你不用对源代码做任何修改,便可以在每一种平台上编译这个使用 REAL 类型的应用程序。唯一要改的是 typedef 本身。

在大多数情况下,甚至这个微小的变动完全都可以通过奇妙的条件编译来自动实现。不是吗? 

标准库广泛地使用 typedef 来创建这样的平台无关类型:size_t,ptrdiff 和 fpos_t 就是其中的例子。

此外,象 std::string 和 std::ofstream 这样的 typedef 还隐藏了长长的,难以理解的模板特化语法,例如:basic_string,allocator> 和 basic_ofstream>。

参考资料:百度百科-typedef



typedef用法如下。

1、隐藏笨拙且难以理解的语法,使用typedef为现有类型创建别名,定义易于记忆的类型名。typedef 还可以掩饰复合类型,如指针和数组。

2、typedef的最简单使用,给已知数据类型long起个新名字,例如叫byte_4。

3、typedef与结构结合使用,这语句实际上完成两个操作:

1) 定义一个新的结构类型。

2) typedef为这个新的结构起了一个名字,叫MyStruct。

4、typedef和define的问题,typedef要比define要好,特别是在有指针的场合。

5、define宏定义有一个特别的长处:可以使用ifdef ,ifndef等来进行逻辑判断,还可以使用undef来取消定义。

参考资料来源:百度百科— typedef 



typedef是在计算机编程语言中用来为复杂的声明定义简单的别名,它与宏定义有些差异。它本身是一种存储类的关键字,与auto、extern、mutable、static、register等关键字不能出现在同一个表达式中。

用法总结编辑

如何创建平台无关的数据类型,隐藏笨拙且难以理解的语法:

使用typedef为现有类型创建别名,定义易于记忆的类型名

?

1

   

typedef int size;

   

?

12345678910

   

void measure(size*psz);  size array[4];  size len=file.getlength();  std::vector<size>vs;

   

typedef 还可以掩饰复合类型,如指针和数组。

例如,你不用像下面这样重复定义有 81 个字符元素的数组:

?

123

   

char line[81]; char text[81];

   

只需这样定义,Line类型即代表了具有81个元素的字符数组,使用方法如下:

?

12345

   

typedef char Line[81]; Line text,line; getline(text);

   

同样,可以像下面这样隐藏指针语法:

?

1

   

typedef char* pstr;

   

?

1

   

int mystrcmp(const pstr p1,const pstr p3);

   

用GNU的gcc和g++编译器,是会出现警告的,按照顺序,“const pstr”被解释为“char* const”(一个指向char的指针常量),而事实上,const char*和char* const表达的并非同一意思,const char*的意思是创建一个指向char类型的指针且不能更改指向地址上的值,而char* const则是不能更改指向的地址;

char* const p : 定义一个指向字符的指针常数,即const指针,常量指针。

const char* p :定义一个指向字符型常量的指针。

typedef语言用法

编辑

基本解释

typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。

在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。

至于typedef有什么微妙之处,请你接着看下面对几个问题的具体阐述。

2. typedef & 结构的问题

当用下面的代码定义一个结构时,编译器报了一个错误,为什么呢?莫非C语言不允许在结构中包含指向它自己的指针吗?请你先猜想一下,然后看下文说明:

?

12345678

   

typedef struct tagNode{ char* pItem; pNode* pNext; }pNode;

   

分析:

1、typedef的最简单使用

?

1

   

typedef long byte_4;

   

给已知数据类型long起个新名字,叫byte_4。

2、 typedef与结构结合使用

?

12345678910

   

typedef struct tagMyStruct{  int iNum; long lLength;  }MyStruct;

   

这语句实际上完成两个操作:

1) 定义一个新的结构类型

?

12345678910

   

struct tagMyStruct{  int iNum;  long lLength; };

   

分析:tagMyStruct称为“tag”,即“标签”,实际上是一个临时名字,struct关键字和tagMyStruct一起,构成了这个结构类型,不论是否有typedef,这个结构都存在。

我们可以用struct tagMyStruct varName来定义变量,但要注意,使用tagMyStruct varName来定义变量是不对的,因为struct 和tagMyStruct合在一起才能表示一个结构类型。

2) typedef为这个新的结构起了一个名字,叫MyStruct。

typedef struct tagMyStruct MyStruct;

因此,MyStruct实际上相当于struct tagMyStruct,我们可以使用MyStruct varName来定义变量。

答案与分析

C语言当然允许在结构中包含指向它自己的指针,我们可以在建立链表等数据结构的实现上看到无数这样的例子,上述代码的根本问题在于typedef的应用。

根据我们上面的阐述可以知道:新结构建立的过程中遇到了pNext域的声明,类型是pNode,要知道pNode表示的是类型的新名字,那么在类型本身还没有建立完成的时候,这个类型的新名字也还不存在,也就是说这个时候编译器根本不认识pNode。

解决这个问题的方法有多种:

1)、

?

12345678910

   

typedef struct tagNode{  char* pItem;  struct tagNode* pNext; }*pNode;

   

2)、

?

12345678910

   

typedef struct tagNode* pNode;  struct tagNode{ char* pItem; pNode pNext;//这边不用pNode* ,pNode 已经表示了struct tagNode*};

   

注意:在这个例子中,你用typedef给一个还未完全声明的类型起新名字。C语言编译器支持这种做法。

3)、规范做法:

?

123456789

   

struct tagNode{ char* pItem; struct tagNode* pNext;}; typedef struct tagNode* pNode;

   

3. typedef & #define的问题

有下面两种定义pStr数据类型的方法,两者有什么不同?哪一种更好一点?

?

123

   

typedef char* pStr; #define pStr char*

   

答案与分析:

通常讲,typedef要比#define要好,特别是在有指针的场合。请看例子:

?

1234567

   

typedef char* pStr1; #define pStr2 char*  pStr1 s1,s2; pStr2 s3,s4;

   

在上述的变量定义中,s1、s2、s3都被定义为char *,而s4则定义成了char,不是我们所预期的指针变量,根本原因就在于#define只是简单的字符串替换而typedef则是为一个类型起新名字。

上例中define语句必须写成 pStr2 s3, *s4; 这样才能正常执行。

#define用法例子:

?

123456789

   

#include <stdio.h>#define f(x) x*xint main(void){    int a=6, b=2, c;    c = f(a) / f(b);    printf("%d
", c);    return 0;}

   

以下程序的输出结果是: 36。

因为如此原因,在许多C语言编程规范中提到使用#define定义时,如果定义中包含表达式,必须使用括号,则上述定义应该如下定义才对:

?

1

   

#define f(x)((x)*(x))

   

当然,如果你使用typedef就没有这样的问题。

4. typedef & #define的另一例

下面的代码中编译器会报一个错误,你知道是哪个语句错了吗?

?

123456

   

typedef char *pStr;char string[4]="abc";const char *p1=string;const pStr p2=string;p1++;p2++;

   

答案与分析:

是p2++出错了。这个问题再一次提醒我们:typedef和#define不同,它不是简单的文本替换。上述代码中const pStr p2并不等于const char * p2。const pStr p2和pStr const p2本质上没有区别,都是对变量进行只读限制,只不过此处变量p2的数据类型是我们自己定义的而不是系统固有类型而已。因此,const pStr p2的含义是:限定数据类型为char *的变量p2为只读,因此p2++错误。

#define与typedef引申谈

1) #define宏定义有一个特别的长处:可以使用 #ifdef ,#ifndef等来进行逻辑判断,还可以使用#undef来取消定义。

2) typedef也有一个特别的长处:它符合范围规则,使用typedef定义的变量类型其作用范围限制在所定义的函数或者文件内(取决于此变量定义的位置),而宏定义则没有这种特性。

5. typedef & 复杂的变量声明

理解复杂声明可用的“右左法则”:
从变量名看起,先往右,再往左,碰到一个圆括号就调转阅读的方向;括号内分析完就跳出括号,还是按先右后左的顺序,如此循环,直到整个声明分析完。举例:
int (*func)(int *p);
首 先找到变量名func,外面有一对圆括号,而且左边是一个*号,这说明func是一个指针;然后跳出这个圆括号,先看右边,又遇到圆括号(只有函数后面才跟形参圆括号),这说明 (*func)是一个函数,所以func是一个指向这类函数的指针,即函数指针,这类函数具有int*类型的形参,返回值类型是int,此处就是声明函数。
int (*func[5])(int *);
func 右边是一个[]运算符,说明func是具有5个元素的数组;func的左边有一个*,说明func的元素是指针(注意这里的*不是修饰func,而是修饰 func[5]的,原因是[]运算符优先级比*高,func先跟[]结合)。跳出这个括号,看右边,又遇到圆括号,说明func数组的元素是函数类型的指 针,它指向的函数具有int*类型的形参,返回值类型为int。

也可以记住2个模式:

type (*)(....)函数指针

type (*)[]数组指针

在编程实践中,尤其是看别人代码的时候,常常会遇到比较复杂的变量声明,使用typedef作简化自有其价值,比如:

下面是三个变量的声明,我想使用typdef分别给它们定义一个别名,请问该如何做?

>1:int *(*a[5])(int, char*);

>2:void (*b[10]) (void (*)());

>3. double(* (*pa)[9])();

答案与分析:

对复杂变量建立一个类型别名的方法很简单,你只要在传统的变量声明表达式里用类型名替代变量名,然后把关键字typedef加在该语句的开头就行了。

>1:int *(*a[5])(int, char*);

//pFun是我们建的一个类型别名

typedef int *(*pFun)(int, char*);

//使用定义的新类型来声明对象,等价于int* (*a[5])(int, char*);

pFun a[5];

>2:void (*b[10]) (void (*)());

//首先为上面表达式加粗部分声明一个新类型

typedef void (*pFunParam)();

//整体声明一个新类型

typedef void (*pFun)(pFunParam);

//使用定义的新类型来声明对象,等价于void (*b[10]) (void (*)());

pFun b[10];

>3. double(* [1]  (*pa)[9])() [2]  ;

//首先为上面表达式蓝色部分声明一个新类型

typedef double(*pFun)();

//整体声明一个新类型

typedef pFun (*pFunParam)[9];

//使用定义的新类型来声明对象,等价于double(*(*pa)[9])();

pFunParam pa;

pa是一个指针,指针指向一个数组,这个数组有9个元素,每一个元素都是“doube(*)()”--也即一个指针,指向一个函数,函数参数为空,返回值是“double”。

typedef代码简化

编辑

上面讨论的 typedef 行为有点像 #define 宏,用其实际类型替代同义字。不同点是 typedef 在编译时被解释,因此让编译器来应付超越预处理器能力的文本替换。例如:

typedef int (*PF) (const char *, const char *);

这个声明引入了 PF 类型作为函数指针的同义字,该函数有两个 const char * 类型的参数以及一个 int 类型的返回值。如果要使用下列形式的函数声明,那么上述这个 typedef 是不可或缺的:

PF Register(PF pf);

Register() 的参数是一个 PF 类型的回调函数,返回某个函数的地址,其署名与先前注册的名字相同。做一次深呼吸。下面我展示一下如果不用 typedef,我们是如何实现这个声明的: [1] 

int (*Register (int (*pf)(const char *, const char *)))

(const char *, const char *);

很少有程序员理解它是什么意思,更不用说这种费解的代码所带来的出错风险了。显然,这里使用 typedef 不是一种特权,而是一种必需。持怀疑态度的人可能会问:"OK,有人还会写这样的代码吗?",快速浏览一下揭示 signal()函数的头文件 ,一个有同样接口的函数。注意这里Register被定义为一个函数而不是函数指针,如果要定义为函数指针应该这样写:int (*(*Register) (int (*pf)(const char *, const char *))) (const char *, const char *);

typedef 和存储类关键字(storage class specifier)

这种说法是不是有点令人惊讶,typedef 就像 auto,extern,mutable,static,和 register 一样,是一个存储类关键字。这并不是说 typedef 会真正影响对象的存储特性;它只是说在语句构成上,typedef 声明看起来象 static,extern 等类型的变量声明。下面将带到第二个陷阱:

typedef register int FAST_COUNTER; // 错误

编译通不过。问题出在你不能在声明中有多个存储类关键字。因为符号 typedef 已经占据了存储类关键字的位置,在 typedef 声明中不能用 register(或任何其它存储类关键字)。

typedef平台开发

编辑

typedef 有另外一个重要的用途,那就是定义机器无关的类型,例如,你可以定义一个叫 REAL 的浮点类型,在目标机器上它可以获得最高的精度:

typedef long double REAL;

在不支持 long double 的机器上,该 typedef 看起来会是下面这样:

typedef double REAL;

并且,在连 double 都不支持的机器上,该 typedef 看起来会是这样:

typedef float REAL;

你不用对源代码做任何修改,便可以在每一种平台上编译这个使用 REAL 类型的应用程序。唯一要改的是 typedef 本身。在大多数情况下,甚至这个微小的变动完全都可以通过奇妙的条件编译来自动实现。不是吗? 标准库广泛地使用 typedef 来创建这样的平台无关类型:size_t,ptrdiff 和 fpos_t 就是其中的例子。此外,象 std::string 和 std::ofstream 这样的 typedef 还隐藏了长长的,难以理解的模板特化语法,例如:basic_string,allocator> 和 basic_ofstream>。



typedef的语法规则其实很简单,一句话来说就是定义对象的语法前加关键字typedef,剩下的不变,原本定义的对象标识符换成类型标识符,对应语义从定义一个对象改成定义一个类型别名。typedef看起来复杂根本原因是对象定义的语法比较复杂,例如分隔符*和[]的用法。
typedef struct node{
datatype data;
struct node *lchild,*rchild;
}bintnode;
对应的对象定义:
struct node{
datatype data;
struct node *lchild,*rchild;
}bintnode;
去除bintnode来看就是一个类型struct node的完整描述。加上了bintnode来看,表示定义了一个struct node类型的对象bintnode。
现在前面有typedef,因此这个bintnode不是对象名而是类型名。也就是定义了一个类型别名bitnode,实际上指的就是struct node这个完整类型。
typedef定义的类型别名在作用域内和被定义的原类型语义上等价,都是表示同一个类型的名称。这里typedef之后bitnode可以和struct node互相代替(注意在C++中,如果同一命名空间内类型名和对象名没有重复,那么struct可以省略,struct node等价于node)。
更复杂一点的:
struct node{
datatype data;
struct node *lchild,*rchild;
}bintnode, *bintree;
注意定义对象时*修饰对象本身而不是修饰类型。因此这里定义了struct node对象bintnode和struct node*类型的对象bintree。
对应的类型定义:
struct node{
datatype data;
struct node *lchild,*rchild;
}bintnode, *bintree;
这里定义了类型别名bintnode表示完整类型struct node,以及bintree表示类型struct node*。
拆开来就成了
typedef struct node{
datatype data;
struct node *lchild,*rchild;
}bintnode;

typedef bintnode *bintree;
这种写法看起来应该稍微清楚了一点。
至于下面的cirqueue,和上面的bintnode类似,只是这里省略了结构体名称,是一个匿名类型。这样写的主要好处是类型名可以省略struct(C++里面不这样写也可以省略)。
====
[原创回答团]

typedef常见用法

1.常规变量类型定义

例如:typedef unsigned char uchar
描述:uchar等价于unsigned char类型定义 uchar c声明等于unsigned char c声明

2.数组类型定义
例如: typedef int array[2];
描述: array等价于 int [2]定义; array a声明等价于int a[2]声明

扩展: typedef int array[M][N];
描述: array等价于 int [M][N]定义; array a声明等价于int a[M][N]声明

3.指针类型定义
例如: typedef int *pointer;
描述: pointer等价于 int *定义;pointer p声明等价于int *a声明

例如: typedef int *pointer[M];
描述: pointer等价于 int *[M]定义 pointer p声明等价于int *a[M]声明明

4.函数地址说明
描述:C把函数名字当做函数的首地址来对待,我们可以使用最简单的方法得到函数地址
例如: 函数:int func(void); unsigned long funcAddr=(unsigned long)func, funcAddr的值是func函数的首地址

5.函数声明
例如: typedef int func(void); func等价于 int (void)类型函数
描述1: func f声明等价于 int f(void)声明,用于文件的函数声明
描述2: func *pf声明等价于 int (*pf)(void)声明,用于函数指针的生命,见下一条

6.函数指针
例如: typedef int (*func)(void)
描述: func等价于int (*)(void)类型
func pf等价于int (*pf)(void)声明,pf是一个函数指针变量

7.识别typedef的方法:
a).第一步。使用已知的类型定义替代typdef后面的名称,直到只剩下一个名字不识别为正确
如typedef u32 (*func)(u8);
从上面的定义中找到 typedef __u32 u32;typedef __u8 u8
继续找到 typedef unsigned int __u32;typedef unsigned char __u8;
替代位置名称 typedef unsigned int (*func)(void);
现在只有func属于未知。
b).第二步.未知名字为定义类型,类型为取出名称和typedef的所有部分,如上为
func等价于unsigned unsigned int (*)(unsigned char);
c).第三部.定义一个变量时,变量类型等价于把变量替代未知名字的位置所得到的类型
func f等价于unsigned unsigned int (*f)(unsigned char)

  • 鏁版嵁缁撴瀯涓 typedef struct 鐢ㄦ硶
    绛旓細鍦–璇█涓,鍙互浣跨敤缁撴瀯浣(Struct)鏉ュ瓨鏀句竴缁勪笉鍚岀被鍨嬬殑鏁版嵁銆傜粨鏋勪綋鐨勫畾涔夊舰寮忎负: struct 缁撴瀯浣撳悕{ 缁撴瀯浣撴墍鍖呭惈鐨勫彉閲忔垨鏁扮粍 }; 缁撴瀯浣撴槸涓绉嶉泦鍚,瀹冮噷闈㈠寘鍚簡澶氫釜鍙橀噺鎴栨暟缁,瀹冧滑鐨勭被鍨嬪彲浠ョ浉鍚,涔熷彲浠ヤ笉鍚,姣忎釜杩欐牱鐨勫彉閲忔垨鏁扮粍閮界О涓虹粨鏋勪綋鐨勬垚鍛(Member)銆 缁撴瀯浣撳畾涔: 绗竴绉:鍙湁缁撴瀯浣撳畾涔 struct...
  • typedef unsigned short int ut 鏄粈涔堟剰鎬?
    绛旓細short int 鏄煭鏁村瀷鐨勬剰鎬濓紝瀛樺偍浣嶆暟鏄16浣嶃傝繖涓鍙ョ殑鎰忔濇槸灏唘t浠h〃unsigned short int鐨勭被鍨嬪畾涔夛紝姣斿ut i锛涘氨鏄皢i瀹氫箟鎴愪簡鏃犵鍙风煭鏁村瀷鍙橀噺銆
  • typedef struct 鐢ㄦ硶鏄粈涔?
    绛旓細typedefstruct鐢ㄦ硶鏄痶ypedef甯哥敤鏉ュ畾涔変竴涓爣璇嗙鍙婂叧閿瓧鐨勫埆鍚嶏紝瀹冩槸璇█缂栬瘧杩囩▼鐨勪竴閮ㄥ垎锛屼絾瀹冨苟涓嶅疄闄呭垎閰嶅唴瀛樼┖闂淬倀ypedef鍙互澧炲己绋嬪簭鐨勫彲璇绘э紝浠ュ強鏍囪瘑绗︾殑鐏垫椿鎬э紝浣嗗畠涔熸湁闈炵洿瑙傛х瓑缂虹偣銆傝嫳璇殑閲嶈鎬 鑻辫鏄竴闂ㄥ绉戯紝鏇存槸涓绉嶅伐鍏凤紝鑰岃繖绉嶅伐鍏风殑鏈鍒濅环鍊间綋鐜板湪鑰冭瘯鎴愮哗涓紝鎴戜滑鍙互寰堝鏄撳湴...
  • typedef鐢ㄦ硶BiTNode,*BiTree;閮芥槸浠涔,璧蜂粈涔堜綔鐢ㄧ殑
    绛旓細BiTNode BiTNode绫诲瀷,BiTree 鎸囧悜BiTNode绫诲瀷鐨勬寚閽;瀹氫箟涓涓狟iTNode绫诲瀷a锛欱iTNode a 锛汢iTree a = BiTNode *a锛
  • typedef struct { DataType data[MAXSIZE]; int last; }SList; 璋佽兘...
    绛旓細typedef struct //璇存槑鏄畾涔変竴涓粨鏋勪綋 { DataType data[MAXSIZE]; //瀹氫箟涓涓狣ataType绫诲瀷鐨勬暟缁勶紝DataType鏄竴涓畯瀹氫箟涓殑绫诲瀷锛屼綘鍙互灏嗗畠鎸囧畾涓篿nt涔熷彲浠ユ寚瀹氫负char浠涔堢殑锛屽叾瀹炲氨鏄敤DataType杩欎釜鍗曡瘝浠f浛浣犵幇鍦ㄦ墍鏈夌殑涓涓被鍨嬨侻AXSIZE涔熸槸涓涓畯瀹氫箟锛岃〃鏄庢暟缁勭殑闀垮害銆俰nt last; //...
  • typedef unsigned char BYTE;鏄粈涔堟剰鎬?typedef鐨鐢ㄦ硶鏄庝箞鏍风殑...
    绛旓細typedef 鐩稿綋浜庣粰鏌愮绫诲瀷璧蜂釜鏂板悕瀛 BYTE灏辨槸涓涓被鍨嬪悕 鐩稿綋浜巙nsigned char绫诲瀷
  • typedef unsigned char uchar #define uchar unsigned char 杩欎袱...
    绛旓細#define瀹氫箟鍙綔瀛楃涓叉浛浠o紝鎶婂凡瀹氫箟杩囩殑鏍囪瘑绗︽垨甯搁噺鐢ㄤ竴涓柊鐨勨滀功鍐欌濆瓧绗︿覆浠f浛锛屼互鍚庝功鍐欐柊瀛楃涓茬殑鍦版柟浼氳缂栬瘧鍣ㄧ敤鏃у瓧绗︿覆鏇挎崲銆傚锛#define A_Z "ABCDEFGHIJKLMNOPQRSTUVWXYZ"锛屼互鍚庢枃鏈腑闄ゆ敞閲婂鐨勭嫭绔婣_Z閮藉皢琚紪璇戝櫒鎹㈡垚ABCDEFGHIJKLMNOPQRSTUVWXYZ銆傝typedef鏄柊绫诲瀷鍚嶅畾涔夌锛屽氨鏄...
  • c++:Status闂(status鏄痗++涓殑鍏抽敭瀛楀悧?鏄竴绉嶆暟鎹被鍨嬪悧?瀹冩湁浠涔堜綔...
    绛旓細typedef int Status锛涢噸鍛藉悕int涓篠tatus锛岃Status濡俰nt銆傚湪C++鐜版湁绫荤殑鍩虹涓婂彲浠ュ0鏄庢柊绫诲瀷锛岃繖灏辨槸缁ф壙鍜岄噸鐢ㄧ殑鎬濇兂銆傞氳繃缁ф壙鍜岄噸鐢ㄥ彲浠ユ洿鏈夋晥鍦扮粍缁囩▼搴忕粨鏋勶紝鏄庣‘绫婚棿鍏崇郴锛屽苟涓斿厖鍒嗗埄鐢ㄥ凡鏈夌殑绫绘潵瀹屾垚鏇村鏉傘佹繁鍏ョ殑寮鍙戙傛柊瀹氫箟鐨勭被涓哄瓙绫伙紝鎴愪负娲剧敓绫汇傚畠鍙互浠庣埗绫婚偅閲岀户鎵挎墍鏈夐潪绉佹湁鐨勫睘鎬у拰鏂规硶...
  • C璇█涓殑鏋氫妇绫诲瀷
    绛旓細濡傛灉涓涓彉閲忓彧鏈夊嚑绉嶅彲鑳界殑鍊硷紝鍒欏彲浠ュ畾涔変负 鏋氫妇绫诲瀷 銆傛墍璋撯滄灇涓锯濇槸鎸囧皢鍙橀噺鐨勫间竴涓鍒椾妇鍑烘潵锛屽彉閲忕殑鍊煎彧闄愪簬鍒椾妇鍑烘潵鐨勫肩殑鑼冨洿鍐呫 澹版槑鏋氫妇绫诲瀷鐢 enum 寮澶淬備緥濡傦細澹版槑浜嗕竴涓灇涓剧被鍨媏num weekday锛屽垯鍙互鐢ㄦ绫诲瀷鏉ュ畾涔夊彉閲忋備緥濡傦細涔熷彲浠ョ洿鎺ュ畾涔夋灇涓惧彉閲忥紝渚嬪锛氬叾涓璼un銆乵on銆佲︺乻at...
  • typedef struct NODE { int num; struct NODE *next; }OLD 璇存硶姝g‘鐨...
    绛旓細杩欓噷鐨刵um灏辨槸姝ょ粨鏋勪綋鐨勪竴涓猧nt绫诲瀷鐨勬垚鍛樸傜粰浣犱妇涓涓皬渚嬪瓙鍚э紝姣斿锛歴truct student{ int no;char[10]name;int age;struct student next;};涓婇潰瀹氫箟鐨勬槸涓涓〃绀哄鐢熺殑缁撴瀯浣擄紝璇ョ粨鏋勪綋鐨勬垚鍛樻湁no锛氱紪鍙凤紝name锛氬鍚嶏紝age锛氬勾榫勶紝杩樻湁涓涓寚鍚戜竴涓猻tudent缁撴瀯浣撶殑鎸囬拡銆傝繖涓寚閽堢殑鐢ㄦ硶浣犲湪閾捐〃...
  • 扩展阅读:typedef unsigned char ... typedef在c语言中用法 ... typedef unsigned int u16 ... typedef struct lnode ... typedef struct用法 ... type a b c啥区别 ... typedef struct结构体 ... typedef int datatype ... typedef enum用法 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网