【发布时间】:2014-08-22 07:56:23
【问题描述】:
我维护了一个非常古老的 C 项目(编写这些的程序员早就不在了),我发现了这样的东西:
(以// 开头的行给出包含以下行的文件的名称。)
声明:
// db/stor_procs/sp_table.c
/* Special hack prototype */
int32_t put_column_value(table_t * tab, row_t * row, u_int16_t colnum, rt_value_t * v);
// db/triggers/specials.c
/* BAD HACK */
int32_t put_column_value(table_t * tab, row_t * row, u_int16_t colnum, rt_value_t * v);
// db_sean_add_alarm/src/rt_access.c
int32_t put_column_value(struct xput_info *xptr, table_t * tab, row_t * row, u_int16_t colnum, rt_value_t * v);
// db_sean_add_alarm/stor_procs/sp_table.c
/* Special hack prototype */
int32_t put_column_value(table_t * tab, row_t * row, u_int16_t colnum, rt_value_t * v);
定义:
// db/src/rt_access.c
int32_t
put_column_value(struct xput_info *xptr, table_t * tab, row_t * row, u_int16_t colnum, rt_value_t * v){//....}
// db_sean_add_alarm/src/rt_access.c
int32_t
put_column_value(struct xput_info *xptr, table_t * tab, row_t * row, u_int16_t colnum, rt_value_t * v){//.....}
程序员从不在头文件中声明put_column_value,而只在.c 文件中给出定义。更奇怪的是,我找不到将table_t * 作为第一个参数的put_column_value 的任何 定义,而且我100% 确定table_t 和struct xput_info是不同的类型(结构)。
但这还不是全部。最奇怪的是我可以在其他 .c 文件中找到 put_column_value 的声明。现在我需要清理代码,但我无法理解如何处理这种 C 魔法。原程序员在这里使用的“魔法”(hack)是什么?
整个项目有点大,我已经尽力简化问题。如果您需要任何其他信息来解决此问题,请告诉我。
编辑
找出原因,这个项目链接到另一个库,并且那个库有一个函数原型的定义,这就是为什么这个“魔术”(hack)可以找到实现。现在来一个大问题要解决——这个项目没有可靠的单元测试,很难为它开发一个,不测试我不能改变代码,不改变代码我不能做单元测试^_^。啊,维护遗留代码总是不是一件令人愉快的任务。
【问题讨论】:
-
该函数在“声明”中的第 3 次出现不是声明,而是定义的开始:它缺少末尾的
;。 -
所有这些 *.c 文件是否都链接到同一个程序或有几个不同的程序?您确定定义中没有
static关键字吗?以及可能改变代码的宏? -
@rodrigo 定义中没有静态关键字;该项目确实链接到其他库;找不到任何宏魔法为这些功能做点什么
标签: c