我知道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上尝试过这个。以下是错误
我知道这个错误意味着我没有得到typedef的实际概念。谁能告诉我哪里错了?
答案 0 :(得分:7)
与#define
不同,typedef
是一种为类型引入新名称的机制,而不是文本替换。
回想一下,long int
,int long
和long
类型是三个引用相同C类型的同义词。当您使用typedef
时,您会创建另一个引用相同类型的同义词。
当你像这样使用它时
mylong x = 123;
用法正确:mylong
用作类型名称。但是,当您尝试将其与int
结合使用时,就像这样
int mylong x = 123;
编译器报告错误,因为int mylong
未命名有效类型。对于编译器,它看起来就像你写的一样,比如int float x = 5
或struct 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