当abcde既是类型又是指针时,C中的sizeof(abcde)

时间:2017-04-12 23:05:14

标签: c language-lawyer typedef sizeof

让我先说明这一点,承认通过以不重叠的方式命名类型和变量来避免这种情况是很容易的。

尽管如此,我很好奇在下列情况下会发生什么:

typedef char jimmypage;

jimmypage *jimmypage;

sizeof(jimmypage)是否等同于sizeof(char)sizeof(char *)

2 个答案:

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