为什么typedef不能在这里工作?

时间:2014-06-25 11:30:13

标签: c typedef

我知道typedef的简单定义:

typedef is a keyword in C to assign alternative names to types.

按照这个定义,我尝试按如下方式实现typedef:

int main()
{
    typedef long mylong; //as per my knowledge after this statement mylong will be treated as long

    int long b;  // this works fine
    int mylong c; // but this gives error
}

我在gcc上尝试过这个。以下是错误

enter image description here

我知道这个错误意味着我没有得到typedef的实际概念。谁能告诉我哪里错了?

4 个答案:

答案 0 :(得分:7)

#define不同,typedef是一种为类型引入新名称的机制,而不是文本替换。

回想一下,long intint longlong类型是三个引用相同C类型的同义词。当您使用typedef时,您会创建另一个引用相同类型的同义词。

当你像这样使用它时

mylong x = 123;

用法正确:mylong用作类型名称。但是,当您尝试将其与int结合使用时,就像这样

int mylong x = 123;

编译器报告错误,因为int mylong未命名有效类型。对于编译器,它看起来就像你写的一样,比如int float x = 5struct mystruct int z = ...

答案 1 :(得分:3)

如果省略C中的类型,则会假定为int

因此typedef long mylong;typedef long int mylong;相同。

让违规行像这样:

int long int c;

因此错误。

typedef是一种新类型*(不是long的文本替换)。因此,您无需添加int来创建该类型的变量。一个简单的mylong c;就足够了。

*嗯,它比这更复杂。新类型实际上与常规long int相同,并且两者是可互换的。但对于声域逻辑,您应该将其视为新的单独类型

答案 2 :(得分:3)

根据第6.7.2节C标准的类型说明符的第2段(约束)

  

每个类型说明符列表都应为一个以下   多集...

— void
— char
— signed char
— unsigned char
— short, signed short, short int, or signed short int
— unsigned short, or unsigned short int
— int, signed, or signed int
— unsigned, or unsigned int
— long, signed long, long int, or signed long int
— unsigned long, or unsigned long int
— long long, signed long long, long long int, or
signed long long int
— unsigned long long, or unsigned long long int
— float
— double
— long double
— _Bool
— float _Complex
— double _Complex
— long double _Complex
— atomic type specifier
— struct or union specifier
— enum specifier
— typedef name

如您所见,C标准不允许将typedef name与其他类型说明符合并。

答案 3 :(得分:2)

你误解了long / short

typedef long mylong;

您说“typedef是C中的关键字,用于为类型分配替代名称。” long实际上不是类型 - long int是类型。 C只允许您在使用int时遗漏short,{{ 1}}或long所以你的陈述等于

long long