mysql++ sql_create_#宏头文件重复定义问题及解决方案咨询
解决mysql++ sql_create_#宏头文件重复定义问题
核心解决方案:拆分声明与定义
mysql++的sql_create_#宏确实会把类的声明和静态成员的定义合并在一起,导致头文件多次包含时触发链接错误。解决思路是手动拆分宏展开后的代码,分离类声明和静态成员定义:
头文件中只保留类声明
把宏展开后的类定义(包含静态成员的static声明,比如static const char* names[];和static const char* table_;)放到头文件,同时加上头文件保护避免重复包含:#ifndef GRID_DATA_H #define GRID_DATA_H #include <mysql++/mysql++.h> class gridData : public mysqlpp::SQLStruct { public: int compare(const gridData& other) const; static const char* names[]; static void table(const char* t); private: static const char* table_; const char* table_override_; // 其他成员变量声明 }; #endif // GRID_DATA_H在单独的.cpp文件中实现静态成员和成员函数
将宏展开中静态成员的定义和成员函数的实现放到.cpp文件中,彻底避免重复定义:#include "grid_data.h" // 定义静态names数组(填写对应字段名称) const char* gridData::names[] = { "id", "column1", "column2" }; // 定义静态table_成员 const char* gridData::table_ = nullptr; // 实现compare函数 int gridData::compare(const gridData& other) const { return sql_compare_gridData<mysqlpp::sql_dummy>(*this, other); } // 实现table函数 void gridData::table(const char* t) { table_ = t; }
关于是否误用或框架bug的说明
- 这不是你的误用:mysql++官方示例都基于单文件场景,
sql_create_#宏的设计就是把声明和定义绑定在一起,没考虑头文件多包含的场景。 - 这也不算严格意义上的框架bug:属于宏设计的局限性——C宏本身缺乏区分声明/定义的机制,要支持头文件场景需要额外的宏拆分设计,但mysql的这套宏并没有做这个处理。
内容的提问来源于stack exchange,提问作者Synopsis
相关产品推荐
相关产品推荐

