c++ struct中只有一个变量有啥意义
方便以后扩展举个栗子...当时写绘图软件...在图面上画散点...我直接用了std::vector\u0026lt;point\u0026gt; 存储点集...后来过了一个月需求扩展了,得支持隐藏哟...于是我用了std::vector\u0026lt;std::pair\u0026lt;point, bool\u0026gt;\u0026gt;面对200多个编译错误,我忍了...又过了一个月...点的样式不一样哟...有的点是五角星,有的点是圆哦...我只好改成class {point, bool, type}std::vectort\u0026lt;class\u0026gt;这次又一千多个编译错误...如果我一开始就用class!!!!~~~~-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-随手举个栗子,不要对号入座...
■网友
类型安全
■网友
我觉得:typedef struct TypeA{ int a_val;} NewTypeforsomereason;更可能以这样的方式被使用:... interface1(NewTypeforsomereason *handle, ...);... interface2(NewTypeforsomereason *handle, ...);... interface3(NewTypeforsomereason *handle, ...);我举两个类似的例子,题主思考一下:1. // winnt.h#ifdef STRICTtypedef void *HANDLE;#if 0 \u0026amp;\u0026amp; (_MSC_VER \u0026gt; 1000)#define DECLARE_HANDLE(name) struct name##__; typedef struct name##__ *name#else#define DECLARE_HANDLE(name) struct name##__{int unused;}; typedef struct name##__ *name#endif#elsetypedef PVOID HANDLE;#define DECLARE_HANDLE(name) typedef HANDLE name#endiftypedef HANDLE *PHANDLE;// windef.hDECLARE_HANDLE(HBITMAP);DECLARE_HANDLE(HBRUSH);DECLARE_HANDLE(HDC);DECLARE_HANDLE(HGLRC); // OpenGLDECLARE_HANDLE(HDESK);DECLARE_HANDLE(HENHMETAFILE);把 HDC 的定义展开后,就是:struct HDC__ { int unused; };typedef struct HDC__ *HDC;和题主的代码段是不是有异曲同工之妙?从表象上来看,struct HDC__ 的 unused 成员是不会被用到的。struct HDC__ 只是作为一个“抽象”的类型(概念)而存在的,我们可以称之为“句柄”。如果这样定义 HDC:typedef void *HDC;是不是就丧失了前面几位大婶所说的 type safety?2. sqlite3 的 C 语言接口以类似这样的方式实现:// sqlite3.htypedef struct sqlite3 sqlite3;typedef struct sqlite3_stmt sqlite3_stmt;SQLITE_API sqlite3_stmt *SQLITE_STDCALL sqlite3_next_stmt(sqlite3 *pDb, sqlite3_stmt *pStmt);// sqlite3.cstruct sqlite3 { ...};SQLITE_API sqlite3_stmt *SQLITE_STDCALL sqlite3_next_stmt(sqlite3 *pDb, sqlite3_stmt *pStmt){ ...}这里,头文件中把两个 incomplete types 的指针类型作为接口 sqlite3_next_stmt 的参数类型。在内部实现(sqlite3.c)中:(1) 在 sqlite3_next_stmt 之前,struct sqlite3 被给予了一个“名分”。它作为一个“抽象”的句柄,管理了一些内部实现用到的资源。所有使用 SQLite 中接口的客户端程序,都只能通过 sqlite3 * 类型的句柄来操作。而 struct sqlite3 究竟是怎么实现的,无可奉告!当然,客户端程序猿也不必关心 struct sqlite3 是究竟如何实现的。这种“封装”为以后的扩展/重构(例如:修改内部实现)提供了便利。(2) struct sqlite3_stmt 在 sqlite3.c 中无对应的具体定义。它用于替代 void *,以提升 type safety。
■网友
可拓展
■网友
方便以后往里面加新的变量
推荐阅读
- 怎样成为一名合格的Python程序员?
- 非计算机专业想要利用课余时间深入自学C++,想要找到比较体面的工作大概需要啥水平
- 底盘|新专利显示苹果汽车挡风玻璃可能会有一个凹槽用于安装传感器
- Java工程师和C++工程师在工作上有啥区别哪个更适合自身发展
- C、C++、java等编程语言都有哪些坑
- c++写http服务器不用cgi和apache该用啥
- 有一个想法:在不同的程序里,使用不用的输入法默认设置, 减少用户切换中英文的次数。大家感觉咋样
- 看完c++ primer plus 还有必要再买本c++ primer看吗?
- 有人可以把C,C++,Python等编程语言开发出来,而我们却难以精通,这说明了啥问题
- 主要产品只有一个客户端软件的网站该咋做推广
