我只在C处就此问题工作。
我有两个函数原型:
int pkg_permserver(const char *service, const char *protocol, int backlog, void (*errlog) (char *msg))
int pkg_permserver_ip(const char *ipOrHostname, const char *service, const char *protocol, int backlog, void (*errlog)(char *msg))
以及以下代码段:
int test_permserv(char *port) {
int return_val;
int num_port;
char *chr_port;
int nr_test_passed=0;
chr_port = (char *) bu_malloc(8 * sizeof( char), "port string");
printf("TESTING PKG_PERMSERVER.....\n PORT PARAMETER TEST: \n");
printf("TESTING VALID PORT...\n");
return_val = pkg_permserver(port ,"tcp", 0, 0);
display(return_val,1,&nr_test_passed);
printf("TESTING INVALID PORT...\n");
num_port = -1;
sprintf(chr_port, "%d", num_port);
return_val = pkg_permserver(chr_port ,"tcp", 0, 0);
display(return_val,0,&nr_test_passed);
}
我正在写一个测试单元。我需要为函数的每个参数测试每个案例(有效/无效)。
我无法修改上述功能。 pkg_permserver和pkg_permserver_ip具有完全相同的参数,除了pkg_permserver_ip另外还有IpOrHostname。
如果我要写另一个函数“test_permserver_ip”我不想复制 - 从test_permserver粘贴部分(因为参数相同)。
我的想法就像int test_permserver(char * port,int which_function);
我想避免为test_permserver_ip复制相同的代码(对于与test_permserver相同的参数) pkg_permserver_ip的测试功能尚未编写。
这是上述两个功能的代码:
int pkg_permserver(const char *service, const char *protocol, int backlog, void (*errlog) (char *msg))
{
struct in_addr iface;
iface.s_addr = INADDR_ANY;
return _pkg_permserver_impl(iface, service, protocol, backlog, errlog);
}
int
pkg_permserver_ip(const char *ipOrHostname, const char *service, const char *protocol, int backlog, void (*errlog)(char *msg))
{
struct hostent* host;
struct in_addr iface;
/* if ipOrHostname starts with a number, it's an IP */
if (ipOrHostname) {
if (ipOrHostname[0] >= '0' && ipOrHostname[0] <= '9') {
iface.s_addr = inet_addr(ipOrHostname);
} else {
/* XXX gethostbyname is deprecated on Windows */
host = gethostbyname(ipOrHostname);
iface = *(struct in_addr*)host->h_addr;
}
return _pkg_permserver_impl(iface, service, protocol, backlog, errlog);
} else {
_pkg_perror(errlog, "pkg: ipOrHostname cannot be NULL");
return -1;
}
}
答案 0 :(得分:3)
正如ATaylor所说,只需从两个函数中提取常见内容并获得类似
的内容int common_stuff_for_permserver(... all common params ...)
{
....
}
int pkg_permserver(...)
{
/// nothing to add here
return common_stuff_for_permserver( ... all params ... );
}
int pkg_permserver_ip(...)
{
/// check for errors from common stuff
if(!common_stuff_for_permserver( ... all params ... )) { return 0; }
/// ip-specific stuff
...
}
如果您不知道如何提取公共部分,请为这两个函数发布更多代码,我们会考虑它。
答案 1 :(得分:0)
强制转换函数指针是一个明确的禁忌。使用接受指向结构指针的中间函数类型。或者使用union-type-tag作为第一个成员的union参数。
中间函数(每个“真实”函数一个)只需从结构中提取正确的参数并将它们传递给正确的函数。