Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当abcde既是类型又是指针时,C中的sizeof(abcde)_C_Language Lawyer_Typedef_Sizeof - Fatal编程技术网

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

当abcde既是类型又是指针时,C中的sizeof(abcde),c,language-lawyer,typedef,sizeof,C,Language Lawyer,Typedef,Sizeof,首先,我要承认,通过以不重叠的方式命名类型和变量,可以很容易地避免这种情况 然而,我很好奇在以下情况下会发生什么: typedef char jimmypage; jimmypage *jimmypage; sizeof(jimmypage)是否等同于sizeof(char)或sizeof(char*)?如果您询问指针的大小与值的比较: #include <stdio.h> typedef char synonym; int main() { synonym* ptr

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

然而,我很好奇在以下情况下会发生什么:

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;
}
如果您询问编译器将使用哪种类型(类型或变量):

#include <stdio.h>

typedef char synonym;

int main()
{
    synonym* synonym;

    printf("synonym: %d\n", sizeof(synonym));

    return 0;
}
因此,本地标识符
main->synonym
优先于全局
typedef char synonym

让我们:

声明一个变量,该变量的名称为
同义词
,类型指针指向周围块中声明的类型
同义词
(相当于
字符
)。该声明隐藏了在周围块中声明的标识符
同义词
,其效果是从这一点向前到当前块的末尾,标识符
同义词
将引用变量而不是类型;也就是说,在块的其余部分中,不能再使用类型名
synonym
,因为
synonym
是一个变量

补充说明:

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

typedef char synonym;
synonym *synonym;          // Syntax error: identifier redeclared
是一个语法错误,因为标识符
同义词
将以不同的含义重新声明

额外补充说明:


如果两个词的意思相同,那么它们就是同义词。两个形式相同但含义不同的单词是。

我相信它实际上不会编译,你不是刚试过吗?我想这会让sizeof(char*)我的编译器(gcc 6.3.0)在
jimmypage*jimmypage中出现错误,并用“jimmypage”重新声明为不同类型的符号您使用的编译器/版本是什么?省略括号也很容易避免混淆。毕竟,
sizeof
是一个操作符,而不是一个函数。如果
typedef char jimmypage在一个周围的块中,并且
jimmypage*jimmypage在内部块中,代码进行编译。然后,jimmypage的大小总是指指针类型的大小(
char*
);而
sizeof*jimmypage
总是指指向类型的大小(
char
)。最后一个有一个好处,它总是产生正确的大小。如果将变量声明更改为
long*jimmypage
,然后是
sizeof*jimmypage==sizeof long
。问题是使用一个与
typedef
名称相同的变量。你的例子一点也不像。@Barmar啊-我不知道。我已经修改了我的答案。同一范围内不能有两个同名的变量。@Barmar再次修复,抱歉@戴:我认为这实际上是C99的一个特性:)
synonym: 8
#include <stdio.h>

typedef char synonym;

int main(void) {

  synonym *synonym;
  printf("sizeof (synonym) = %ld\n", (long) sizeof (synonym));
  return 0;
}
synonym *synonym;
typedef char synonym;
synonym *synonym;          // Syntax error: identifier redeclared