| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1879 人关注过本帖
标题:请教指针函数的定义方法
只看楼主 加入收藏
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
结帖率:79.17%
收藏
 问题点数:0 回复次数:12 
请教指针函数的定义方法
为什么 我使用
#include<stdlib.h>
#include<stdio.h>

int atexit(void (*func)())
{
 func();
return  0 ;
}

void fun()
{
 printf("fun\n");
}

int main()
{
 atexit(fun);
    printf("hello\n");
    return 0;
}
是正确的
但是使用
#include<stdlib.h>
#include<stdio.h>

void atexit(void (*func)())
{
 func();
return ;
}

void fun()
{
 printf("fun\n");
}

int main()
{
 atexit(fun);
    printf("hello\n");
    return 0;
}
则提示error C2371: 'atexit' : redefinition; different basic types 呢??
搜索更多相关主题的帖子: 指针函数 定义方法 redefinition C2371 
2008-10-07 23:54
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
首先提醒你,atexit是库函数,在stdlib.h里面定义,其函数原型为:
    int atexit(void (*function)(void));

所以,其实你去掉stdlib.h的包含,就可以通过编译了…………

但是,其实我也没有想明白,为什么第一个程序,重复定义了库函数,却没有报错……我的猜想是,如果重复定义库里面的函数,编译器是不报错的,不过不敢确定。

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-10-08 00:14
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
= =似乎我的猜想是对的……参看下面的程序:
程序代码:
#include <stdio.h>
int putchar(int ch){printf("new getchar\n");return ch;}

int main()
{
    putchar('a');
    return 0;
}

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-10-08 00:36
qfyzy
Rank: 2
等 级:论坛游民
威 望:1
帖 子:380
专家分:86
注 册:2008-2-17
收藏
得分:0 
LS的想法是正确的。详细情况可以见下C专家编程,里面有详细的解释。
这种行为叫做Interpositioning
翻译过来就是用自己的函数代替库函数的一种行为

[[it] 本帖最后由 qfyzy 于 2008-10-8 07:58 编辑 [/it]]

当对C的经验增加时,它会显的很好用.----Dennis M Ritche如是说
2008-10-08 01:03
forever74
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:CC
等 级:版主
威 望:58
帖 子:1686
专家分:4252
注 册:2007-12-27
收藏
得分:0 
准确地说LZ的问题是函数的定义和原型声明的不一致。

[[it] 本帖最后由 forever74 于 2008-10-8 12:26 编辑 [/it]]
2008-10-08 12:16
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
回复 5# forever74 的帖子
void atexit(void (*func)())
{
func();
return ;
}
上面的定义和 stdlib.h中的声明不一致?
2008-10-08 19:12
forever74
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:CC
等 级:版主
威 望:58
帖 子:1686
专家分:4252
注 册:2007-12-27
收藏
得分:0 
是啊,不一致就会出这种错误
单单替换库函数是不会报错的
2008-10-08 19:51
ytb745892798
Rank: 1
来 自:漳平。永福
等 级:新手上路
帖 子:63
专家分:0
注 册:2008-9-29
收藏
得分:0 
我在看程序是和5楼的想法一样!

我的梦想是成为一名出色的程序员!
2008-10-08 21:34
xfcy
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2008-9-15
收藏
得分:0 
void atexit(void (*func)())
{
func();
return ;
}
定义了无返回值的函数,就不应该加 return ;语句
2008-10-08 22:00
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
回复 3# StarWing83 的帖子
#include<stdio.h>
void atexit(void (*func)())
{
    func();
    return ;
}
void fun()
{
    printf("fun\n");
}

int main()
{
    atexit(fun);
    printf("hello\n");
    return 0;
}
上面的代码在vc6下还是不行,提示:
error C2556: 'void __cdecl atexit(void (__cdecl *)(void))' : overloaded function differs only by return type from 'int __cdecl atexit(void (__cdecl *)(void))'
        C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\a01836if(71) : see declaration of 'atexit'
但是只要把  函数名 atexit替换成 atexit1 就OK 了
怎么我这里的 Interpositioning 不适用?

[[it] 本帖最后由 vfdff 于 2008-10-8 22:34 编辑 [/it]]
2008-10-08 22:32
快速回复:请教指针函数的定义方法
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.012642 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved