让我先说明这一点,承认通过以不重叠的方式命名类型和变量来避免这种情况是很容易的。
尽管如此,我很好奇在下列情况下会发生什么:
typedef char jimmypage;
jimmypage *jimmypage;
sizeof(jimmypage)
是否等同于sizeof(char)
或sizeof(char *)
?
答案 0 :(得分:4)
我们make it work:
#include <stdio.h>
typedef char synonym;
int main(void) {
synonym *synonym;
printf("sizeof (synonym) = %ld\n", (long) sizeof (synonym));
return 0;
}
声明
synonym *synonym;
声明一个名为synonym
的变量,该变量类型指针指向周围块中声明的类型synonym
(相当于char
)。此声明 shadow 在周围块中声明的标识符synonym
,其效果是从此点开始到当前块的末尾,标识符synonym
将引用变量而不是类型;也就是说,在块的其余部分中,不能再使用类型名称synonym
,因为synonym
是变量。
补充说明:
声明是合法的,因为类型是在周围的块中声明的。试图将变量声明为与类型
相同的级别typedef char synonym;
synonym *synonym; // Syntax error: identifier redeclared
是语法错误,因为标识符synonym
将以不同的含义重新声明。
额外补充说明:
如果两个词具有相同的含义,则它们是同义词。两个具有相同形式但含义不同的单词是homonyms。
答案 1 :(得分:-1)
如果您询问指针的大小与值相比:
#include <stdio.h>
typedef char synonym;
int main()
{
synonym* ptr;
synonym val;
printf("ptr: %d\n", sizeof(ptr));
printf("val: %d\n", sizeof(val));
return 0;
}
给我:
ptr: 8
val: 1
如果您询问编译器将使用哪种东西(类型或变量):
#include <stdio.h>
typedef char synonym;
int main()
{
synonym* synonym;
printf("synonym: %d\n", sizeof(synonym));
return 0;
}
给我:
synonym: 8
因此,本地标识符main -> synonym
优先于全局typedef char synonym
。