PS:注意到一个问题~
strchr函数就算是不加string.h库也是可以用的,不过返回值却是size_t型,加了的话返回的是char*型~
感觉规范的库函数应该要考虑其它库兼容的问题~
不然会可能出现重复定义两次甚至多次的情况~
解决这个问题的其中方法是把每一个函数的前面都用一个唯一的宏定义作为一个标记~
如果遇到重复定义的情况不能通过编译的时候,那么把重复出现的宏去掉就可以了~
例如我上面这个具体点就是
XXX.h
程序代码:
#define XXXXX_COMP_ \
int int Comp(const void* p1,const void* p2);
//XXXXX具有唯一性
#define XXXXX_INPUT_ \
void Input(char* s,size_t size);
XXX.c
程序代码:
#ifdef XXXXX_COMP_
int Comp(const void* p1,const void* p2)
{
return strcmp(p1,p2);
}
#endif
#ifdef XXXXX_INPUT_
void Input(char* s,size_t size)
{
char* p;
fgets(s,size,stdin);
if ((p=strchr(s,'\n'))!=NULL)
*p='\0';
else
while (getchar()!='\n');
}
#endif
如果第二个实现文件也定义了
Comp函数例如
#define YYYYY_COMP_
\
int int Comp(const void* p1,const void* p2);
#ifdef YYYYY_COMP_
int Comp(const void* p1,const void* p2)
{
return strcmp(p1,p2);
}
#endif
这样就会出现重复编译的情况,这时把头文件里面的#define YYYYY_COMP_去掉或者
#undef YYYYY_COMP_就可以了~
感觉加了string.h和不加string.h的函数返回值类型不一致应该是声明部分的接口和定义不一致有关~总之声明可以有多处地方,但实现只能有一处地方
~
删去头文件的#define YYYYY_COMP_ 这样可以从根本解决问题,但这样改变主体的结构就不好维护了~
所以还是可以在其所在的头文件里面直接用#undef来解决问题,到时需要的时候只需要删去#undef就可以了~
但这样虽然方便,但还是不能完美解决问题的,因为声明了那个函数不止一次,所以有可能出现函数接口和实现主体参数不一致的情况,所以通常团体合作的时候在写项目的时候要为用到函数帮助文档,里面说明参数类型返回值类型以及基本功能等,还需要保持一致以来达成共识是有必要的~当然这只是在团体合作管理的时候出现,一般情况下个体户自定义函数通常是没有这个必要的
~
[此贴子已经被作者于2018-1-7 21:34编辑过]