【问题标题】:sizeof(abcde) in C when abcde is both a type and a pointer当 abcde 既是类型又是指针时,C 中的 sizeof(abcde)
【发布时间】:2017-09-08 21:51:43
【问题描述】:

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

不过,我很好奇以下情况会发生什么:

typedef char jimmypage;

jimmypage *jimmypage;

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

【问题讨论】:

  • 我相信它实际上不会编译,你不只是尝试了吗?
  • 我认为需要 sizeof(char*)
  • 我的编译器 (gcc 6.3.0) 出现错误,jimmypage *jimmypage; 使用的是什么编译器/版本?
  • 省略括号也很容易避免混淆。毕竟,sizeof 是一个运算符,而不是一个函数。如果typedef char jimmypage; 在周围块中,而jimmypage *jimmypage; 在内部块中,则代码编译。那么sizeof jimmypage总是指指针类型的大小(char *); sizeof *jimmypage 总是指指向类型的大小 (char)。最后一个的好处是它总是会产生正确的大小。如果将变量声明更改为long *jimmypage;,则为sizeof *jimmypage == sizeof long

标签: c language-lawyer typedef sizeof


【解决方案1】:

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

补充说明:

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

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

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

补充说明:

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

【讨论】:

    【解决方案2】:

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

    #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 -&gt; synonym 优先于全局typedef char synonym

    【讨论】:

    • 问题是关于使用名称与typedef 相同的变量。你的例子没有这样的东西。
    • @Barmar Ah - 我没有意识到这一点。我已经修改了答案。
    • 同一范围内不能有两个同名变量。
    • @Barmar 再次修复,抱歉!
    • @Dai 我认为这实际上是 C99 的一个特性 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-12
    • 2019-02-25
    • 2019-05-25
    • 2015-11-20
    • 2019-06-22
    • 2018-01-28
    • 1970-01-01
    相关资源
    最近更新 更多