分类:
2008-10-13 16:14:13
//filename: b.h #ifndef B_H #define B_H typedef long INT32; void b_bar(INT32 num); #endif //B_H
//filename: b.c #include#include "b.h" void b_bar(INT32 num) { printf("b_bar trace: %d\n", num); }
//filename: a.h #ifndef A_H #define A_H typedef short INT32; void a_foo(INT32 num); #endif //A_H
//filename: a.c #include源代码中A代码和B代码中并无任何瓜葛。A代码和B代码中都定义了一个叫做INT32的类型,但是在A代码中INT32是以short为原型的,就是说A代码中所有使用INT32的类型都是期望使用short的。同理,B代码中的所有使用INT32类型的地方都是期望使用long的。因此,我们只要在移植过程中保证A代码和B代码中的类型定义都满足自己原始的期望,那么这个移植过程中类型定义就是成功的,代码运行起来也就会很稳定;反之,移植的代码就存在着极大的风险。#include "a.h" void a_foo(INT32 num) { printf("a_foo trace: %d\n", num); } int main() { INT32 abc=100; a_foo(abc); }
//filename: a.c #include但是,我们代码如果这么使用的话,就会出错。错误的原因大概是:redefinition; different basic types。重复定义,不一致的基本类型。因为A代码和B代码中都定义了INT32这个类型。#include "a.h" //////// Add this include sentence,We want use B 's declare #include "b.h" void a_foo(INT32 num) { printf("a_foo trace: %d\n", num); } void a_xxx(INT32 num) ///////// Add this function { printf("a_xxx trace: %d\n", num); b_bar(num); ///////// Call b_bar() function } int main() { INT32 abc=100; a_foo(abc); a_xxx(abc); ///////// Use a_xxx() function }
//filename: a.c #include如上面代码所示,我不再在A代码里面include B代码的.h文件,这样就避免了typedef的重复定义。同时,我修改了extern的b_bar()的声明,使其使用C语言基本类型long,这样就满足了B代码的原始期望,B代码运行起来就不会有错。通过extern,将问题推迟到链接期,链接的过程中是以原始类型为基准的,所以链接起来也不会出错。基本上就解决了这个问题。#include "a.h" ///Use extern declare instead of include sentence, and use long instead of INT32 extern void b_bar(long num); void a_foo(INT32 num) { printf("a_foo trace: %d\n", num); } void a_xxx(INT32 num) ///////// Add this function { printf("a_xxx trace: %d\n", num); b_bar(num); ///////// Call b_bar() function } int main() { INT32 abc=100; a_foo(abc); a_xxx(abc); ///////// Use a_xxx() function }
//filename: b.h #ifndef B_H #define B_H #ifndef A_H typedef long INT32; #endif void b_bar(INT32 num); #endif //B_H修改b.h,而b.c、a.h 使用代码片断1的,a.c使用代码片断2的。
//filename: b.h #ifndef B_H #define B_H typedef long B_INT32; void b_bar(B_INT32 num); #endif //B_H
//filename: b.c #include#include "b.h" void b_bar(B_INT32 num) { printf("b_bar trace: %d\n", num); }
//filename: b_type_adapt.h typedef B_INT32 A_INT; typedef B_UINT32 A_UINT;
//filename: b.h #ifndef B_H #define B_H #define INT32 B_INT32 typedef long INT32; void b_bar(INT32 num); #undef INT32 #endif //B_H
//filename: b.c #include只需要修改B代码中相应的位置就可以了。起初偶也考虑使用这种方法。但是这个方法不切合实际的地方就是要把所有b.c中都对应的加上#define INT32 B_INT32和#undef INT32这种宏。而b.c这种文件特别多,几百个是有的,关系有特别复杂,我们是移植B代码,不便对其结构大做改动,以后B代码升级了我们也不好同步阿。#include "b.h" #define INT32 B_INT32 void b_bar(INT32 num) { printf("b_bar trace: %d\n", num); } #undef INT32