You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C89/C90标准中,裸函数类型的typedef声明是否合法?

C89/C90标准中裸函数类型的typedef声明是否合法?

先看示例代码:

#include <stdio.h>
#include <string.h>

typedef int INTFUNC(char *, char *);
INTFUNC lencmp;

int main(void) {
    printf("%d\n", lencmp("a", "aaa")); /* -1 */
    printf("%d\n", lencmp("aaa", "aaa")); /* 0 */
    printf("%d\n", lencmp("aaa", "a")); /* 1 */

    return 0;
}

int lencmp(char *s, char *t) {
    size_t len1 = strlen(s), len2 = strlen(t);
    return (len1 > len2) - (len1 < len2);
}

这段代码使用GCC编译器搭配-std=c90 -pedantic -Wall -Wextra选项可正常编译且无警告。但K&R第二版仅展示函数指针的typedef用法,未出现此类代码;而C99及之后的标准明确允许裸函数类型的typedef,维基百科的表述曾引发该写法是否为编译器扩展的争议。

结论:C89/C90标准中,裸函数类型的typedef声明是合法的

依据C89(ISO/IEC 9899:1990)标准的核心条款:

  • 6.5.6 Typedef declarations:typedef的作用是为已存在的类型创建别名,而函数类型属于标准定义的合法类型范畴,因此可以通过typedef为函数类型定义别名。
  • 6.1.7 Function declarators:允许使用函数类型标识符来声明函数,INTFUNC lencmp;本质上等价于int lencmp(char *, char *);,完全符合C89的函数声明规则。

GCC在-std=c90 -pedantic严格模式下无警告编译通过,也侧面验证了该写法符合C89标准。K&R第二版未展示此类用法仅为示例覆盖范围限制,并不代表标准禁止该写法。

内容的提问来源于stack exchange,提问作者Lover of Structure

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 12:13:26