根据标准N1570 6.7.8:
$time[] = $alltime;
声明没有引入新类型,只是一个同义词 如此指定的类型。
所以我希望不可能写这样的东西:
Array
(
[0] => 00:20:00
[1] => 00:15:00
[2] => 00:20:00
[3] => 00:20:00
[4] => 00:55:00
[5] => 00:05:00
)
,并且应该编译失败,因为没有提供要引入同义词的类型。但这很好:Demo。那么,这意味着什么?为什么要编译?
答案 0 :(得分:6)
这取决于以下事实:缺少的类型说明默认为int
。
所以,你的声明
typedef t;
与
相同 typedef int t;
使用适当级别的警告,编译器会发出警告:
warning: type defaults to ‘int’ in declaration of ‘t’ [-Wimplicit-int]
typedef t;
^
也就是说,不要依靠这种行为,自C99
起,“隐式int”规则已过时。
答案 1 :(得分:3)
默认为int
。
编译器警告显示了正在发生的情况:
#1 with x86-64 gcc 8.2
<source>:1:9: warning: type defaults to 'int' in declaration of 't' [-Wimplicit-int]
typedef t;
从 C99 开始,删除了隐式 int
规则。因此,这不适用于C99以后的版本。
如果您在GCC中使用 -pedantic-errors
编译器选项(表示严格遵守该标准),则会发出错误。参见here。
如果您有兴趣,可以使用 C89 标准中的relevant section:
3.5.2类型说明符
每个类型说明符列表应为以下集合之一;类型说明符可以以任何顺序出现,并且可能与其他声明说明符混合在一起。
- void
- char
- 签名字符
- 未签名的字符
- short,有符号的short,short int或有符号的short int
- unsigned short或unsigned short int
- int,signed,signed int或没有类型说明符
因此在 C99 中,上面加粗的部分的最后一部分(或没有类型说明符)被删除。
答案 2 :(得分:0)
typedef
声明定义对象或指针类型的同义词。因此,您应该同时指定要为其创建同义词的类型和要用作同义词的名称。
例如:
// 'byte_t' is a synonym for 'unsigned char'
typedef unsigned char byte_t;
// 'handler_t' is a synonym for 'void (*)(int)', a function pointer
typedef void (*handler_t)(int);
// 'short_p' is a synonym for 'short *'
typedef short * short_p;
// 'record' is a synonym for an anonymous structure
typedef struct {
int a;
char *b;
} record;
// 'error_p' is a synonym for a pointer to 'struct error', defined somewhere else
typedef struct error *error_p;
您引用的来源中有更多示例。