看不懂一种typedef的用法

clever101
领域专家: C/C++技术领域
2006-10-24 03:35:18
在一个c文件中有这样的代码:
typedef int (LookUpIdProcType)(char *IdName,long *Id);

extern "c" int MathExprEval(char *expr_ptr,MathValueType *mValue,LookUpIdProcType,LookUpValueProcType *LookUpValueProc);

我不是很理解typedef int (LookUpIdProcType)(char *IdName,long *Id);这一句。 我猜(LookUpIdProcType)(char *IdName,long *Id)是一个函数,int为它的返回值类型。下面int MathExprEval(char *expr_ptr,MathValueType *mValue,LookUpIdProcType,LookUpValueProcType *LookUpValueProc);就更让我费解了。照我的想法,函数名LookUpIdProcType居然成了类型?那么函数MathExprEval的执行顺序是怎样的呢?还有如果(LookUpIdProcType)(char *IdName,long *Id)是一个函数,但是我根本找不到它的实现代码。我想到的可能是因为它处在最底层,为了抽象化,其实现是由其上层的和这个函数具备相同类型、相同个数的参数及返回值的函数来实现的。 请大虾们详细解释一下。
...全文
5100 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangtopcool 2006-12-07
  • 打赏
  • 举报
回复
mark
sunshine810 2006-12-03
  • 打赏
  • 举报
回复
2楼和4楼的解释都十分详细了!
axx1611 2006-12-03
  • 打赏
  • 举报
回复
楼上的都理解复杂了
extern "C"就是告诉C++编译器,不要对这个静态函数/变量改名字
这就严格限制了extern "C"的函数/变量一定:
1、不能重载
2、不能是类成员
换句话说其行为完全与C函数/静态变量相同。
yin138 2006-12-03
  • 打赏
  • 举报
回复
各位大虾,你们对extern "C" 为什么用这种方式解释呢?
extern "C"主要是用在C++编译环境下使用,使用编译器不要在函数加上代号,因为C++支持重载,所以函数编译后会将函数名改变。所以在C++中要使用使编译器产生的函数不将函数名改变,就得使用extern "C"
另外,楼主的第一个函数指针声明少了一个星号。
还有,在将函数指针作为参数时,它只是一个4个字节的数据,所以它不会存调用问题。
Mauney 2006-12-03
  • 打赏
  • 举报
回复
extern "C"是表示可以全局调用的C函数吧
dylin 2006-12-03
  • 打赏
  • 举报
回复
jf
皮鲁 2006-12-02
  • 打赏
  • 举报
回复
extern "C" 是让编译器用C的方式生成OBJ文件,一般在动态库导出时用到;
C++编译到处的时候可能加一些符号,而C就是很简单加个_FUNC;
导出的时候加extern "C",导出函数就是函数名,C++则把函数参数等用特殊方式编码
jwqu 2006-12-02
  • 打赏
  • 举报
回复
GUANZHU
lzg0001 2006-12-02
  • 打赏
  • 举报
回复
学习!!!
laowang2 2006-12-02
  • 打赏
  • 举报
回复
mark
极光叔叔 2006-12-02
  • 打赏
  • 举报
回复
typedef int (LookUpIdProcType)(char *IdName,long *Id);

extern "c" int MathExprEval(char *expr_ptr,MathValueType *mValue,LookUpIdProcType,LookUpValueProcType *LookUpValueProc);

第一个typedef定义的是一种类型,这种类型是一个函数,与定义函数指针类型相似。
第二个函数声明中令楼主感到困惑的应该是LookUpIdProcType这一句,其他的我想只是这个文件
中定义的类型的指针而已。而LookUpIdProcType这一句其实也很简单的,我想:
用一个例子来说明下:
int fun(int a, int b);
int fun(int a, int);
int fun(int, int);
这三种声明是相同的方法。
wxspll 2006-12-02
  • 打赏
  • 举报
回复
mark
Leomaxking 2006-12-01
  • 打赏
  • 举报
回复
.
Alassic 2006-12-01
  • 打赏
  • 举报
回复
extern "c" int MathExprEval(char *expr_ptr,MathValueType *mValue,LookUpIdProcType,LookUpValueProcType *LookUpValueProc);是不是应该这样写啊:
extern "c";
int MathExprEval(char *expr_ptr,MathValueType *mValue,LookUpIdProcType,LookUpValueProcType *LookUpValueProc);
要不然我真看不懂为什么要在MathExprEval函数前加个extern "c"了?
请大家帮忙解释下
谢谢
finalcreator 2006-12-01
  • 打赏
  • 举报
回复
extern "c" 是什么东西,请大侠求解
hgdldhxl 2006-12-01
  • 打赏
  • 举报
回复
那里不会是写错了吧,哪有那种返回类型的,要不编译编译
sunboyljp 2006-11-30
  • 打赏
  • 举报
回复
go on!我爱足球!
axx1611 2006-11-30
  • 打赏
  • 举报
回复
函数指针啊~~而且还漏了星号~~~
好好补习C语言基础吧~~
yangman211 2006-11-30
  • 打赏
  • 举报
回复
ddddddd
baibai1983 2006-11-30
  • 打赏
  • 举报
回复
定义的是一个函数指针阿,没有什么奇怪的
加载更多回复(11)

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧