C与C++在函数指针上的区别
最近为C语言写一些数据结构相关的库,遇到一个有趣的问题。我最初版本的代码能够在GCC下用纯C编译通过,但是却不能用C++编译通过,尝试用Visual C++6.0编译,也是报一样的错。我还一直以为C++能够完全的兼容C呢,看来观点需要变化了。
下面详细说明下。
我定义了一个stack结构体(最初的定义)如下:
1 2 3 4 5 6 7 8 9 | typedef struct easyc_stack{ int inc_size; int point; int * base; int size; int (*pop)(); int (*push)(); int (*get_top)(); }c_stack; |
在另外的代码里我声明了一个函数
1 | int ugly_easyc_pop(c_stack *); |
然后编写一个stack创建函数
1 2 3 4 5 6 7 | c_stack make_stack(int size){ c_stack s; .....//some code s.pop=ugly_easyc_pop; .....//some code return s; } |
在纯C编译器中,这样的做法毫无问题,经过测试,push, pop也能正常工作。
但是在用C++编译器编译就出问题了,看错误信息是类型不匹配,C++编译器认为 int (*)()与 int (*)(c_stack *)是不一样的类型,而C编译器觉得无所谓。因此,要在C和C++中都正常编译,需要修改c_stack中函数指针的定义,修改如下:
1 2 3 4 5 6 7 8 9 | typedef struct easyc_stack{ int base_size; int point; int * base; int size; int (*pop)(struct easyc_stack *); int (*push)(int,struct easyc_stack *); int (*get_top)(struct easyc_stack ); }c_stack; |
我猜C++这样做的原因可能是因为它支持函数的overload,因而,同函数名,不同的参数被认为是不同的类型了。
认领 BANGD2569BE2B2E8A4BC39F1189CXIANGUO





