如何避免同名函数与宏定义的冲突?含C语言矩阵初始化场景
解决同名函数与宏的展开冲突问题
方法一:临时取消宏定义
在函数定义的代码段前后,分别用#undef取消宏、#define恢复宏,这样函数定义时不会被错误展开,其他代码区域仍能正常使用宏的功能:
// 先取消宏定义,避免函数被展开 #undef init_matrix void init_matrix(Matrix *mat, double ea[], size_t size) { for (int i = 0; i < mat->row; i++) for (int j = 0; j < mat->col; j++) { if (!(i*mat->col+j<size)) return; mat->entries[i][j] = ea[i*mat->col + j]; } } // 重新定义宏,恢复原有功能 #define init_matrix(mat, ...) init_matrix(mat, (double []) {__VA_ARGS__}, sizeof((double []) {__VA_ARGS__})/sizeof(double))
方法二:用括号包裹函数名规避宏匹配
C语言中,宏只会匹配独立的标识符,给函数名加上括号后,宏不会识别并展开它,这样函数定义可以正常保留,宏也能在其他地方使用:
// 函数名用括号包裹,避免被宏替换 void (init_matrix)(Matrix *mat, double ea[], size_t size) { for (int i = 0; i < mat->row; i++) for (int j = 0; j < mat->col; j++) { if (!(i*mat->col+j<size)) return; mat->entries[i][j] = ea[i*mat->col + j]; } } #define init_matrix(mat, ...) init_matrix(mat, (double []) {__VA_ARGS__}, sizeof((double []) {__VA_ARGS__})/sizeof(double))
方法三:规范命名,避免同名冲突
这是最推荐的做法——遵循C语言的惯例:宏名用全大写,函数名用小写(或驼峰),直接让两者名字区分开,从根源上解决冲突:
// 函数保持原有命名 void init_matrix(Matrix *mat, double ea[], size_t size) { for (int i = 0; i < mat->row; i++) for (int j = 0; j < mat->col; j++) { if (!(i*mat->col+j<size)) return; mat->entries[i][j] = ea[i*mat->col + j]; } } // 宏改用全大写命名 #define INIT_MATRIX(mat, ...) init_matrix(mat, (double []) {__VA_ARGS__}, sizeof((double []) {__VA_ARGS__})/sizeof(double))
后续调用宏时用INIT_MATRIX(...),调用函数时用init_matrix(...),完全不会有冲突问题。
内容的提问来源于stack exchange,提问作者hansoko
相关产品推荐
相关产品推荐

