前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基础知识 | 每日一面(8)

基础知识 | 每日一面(8)

作者头像
小林C语言
发布2019-12-18 16:54:14
2720
发布2019-12-18 16:54:14
举报
古代的剑客们与

对手相逢时,无

论对手多么强大,

明知不敌,也要亮出自己的剑!

读者:怎样建立和理解非常复杂的声明?例如定义一个包含 N 个指向返回指向字符的指针的函数的指针的数组?

小林:这个问题至少有以下 3 种答案:

1. char *(*(*a[N])())();

2. 用 typedef 逐步完成声明:

typedef char *pc; /* 字符指针 */

typedef pc fpc(); /* 返回字符指针的函数 */

typedef fpc *pfpc; /* 上面函数的指针 */

typedef pfpc fpfpc(); /* 返回函数指针的函数 */

typedef fpfpc *pfpfpc; /* 上面函数的指针 */

pfpfpc a[N]; /* 上面指针的数组 */

3. 使用 cdecl 程序, 它可以把英文翻译成 C 或者把 C 翻译成英文:

cdecl> declare a as array of pointer to function returning

pointer to function returning pointer to char

char *(*(*a[])())()

通过类型转换, cdecl 也可以用于解释复杂的声明, 指出参数应该进入哪一对括号 (如同在上述的复杂函数定义中)。

读者:函数只定义了一次, 调用了一次, 编译器为什么提示非法重定义了?

小林:在范围内没有声明就调用 (可能是第一次调用在函数的定义之前) 的函数被认为返回整型 (int) (且没有任何参数类型信息), 如果函数在后边声明或定义成其它类型就会导致矛盾。所有函数 (非整型函数一定要) 必须在调用之前声明。

有时候,正是那些意想不到之人,成就了无人能成之事。——图灵

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-12-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 C语言入门到精通 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档