C与C++在函数指针上的区别

Written on August 21, 2008 – 1:09 pm | by 陈炬 | 177 views

最近为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

Rating: 3.3/5 (18 votes cast)

推荐购买的书籍--都是牛书

相关文章

我来说下

关于

我叫陈炬,正在天津大学计算机学院->知识工程与科学研究所攻读硕士研究生。今年应届。您可以在我的自我介绍获得更多关于我的信息

订阅我的Blog


本站RSS地址| [这是什么?]
订阅到Google Reader | 订阅到 抓虾 阅读器 | 订阅到 鲜果 阅读器

其他blog

我还有一个英文blog,非常的无聊,琐碎,许多的语法错误。请谨慎访问。
Find entries :