没有类型的typedef是什么意思?

时间:2018-11-28 05:16:13

标签: c typedef

根据标准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。那么,这意味着什么?为什么要编译?

3 个答案:

答案 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;

您引用的来源中有更多示例。