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

sizeof(abcde) in C when abcde is both a type and a pointer

首先让我承认通过以不重叠的方式命名类型和变量很容易避免这种情况。

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

typedef char jimmypage;

jimmypage *jimmypage;

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

如果您询问的是指针与值相比的大小:

#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

让我们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)。此声明 shadows 标识符 synonym 在周围块中声明,其效果是从这一点向前到当前块的末尾,标识符 synonym 将引用变量而不是类型;也就是说,在块的其余部分中,类型名称 synonym 不能再使用,因为 synonym 是一个变量。

补充说明:

该声明是合法的,因为该类型是在周围的块中声明的。尝试在与类型相同的级别声明变量

typedef char synonym;
synonym *synonym;          // Syntax error: identifier redeclared

是语法错误,因为标识符 synonym 将以不同的含义重新声明。

额外补充说明:

如果两个词具有相同的含义,则它们是同义词。两个形同义不同的词是homonyms.