【问题标题】:Can't compile with void variable in C无法在 C 中使用 void 变量进行编译
【发布时间】:2011-10-16 13:51:59
【问题描述】:

test.c

int main () {
   void a;
   return 0;
}

我使用 gcc 编译但它给了我一个错误:

错误:变量或字段“a”声明为无效

从我读到的here, 我以为我可以毫无问题地声明 void 变量。

【问题讨论】:

  • 您可以有一个 指向 void 的指针 (void *),但没有 void 变量之类的东西。
  • 拥有void 类型的变量我认为没有任何用处。一般来说,void 表示什么都没有,例如返回 void 的函数正常返回,但不会将任何内容传回给调用者。在完全不同的意义上,指向 void 的指针只是意味着尚未指定指针所指向的类型。

标签: c variables types void


【解决方案1】:

不,但您可以声明一个 void 指针:void *void * 可以保存任何对象指针。

void * 只保证保存对象(即数据)指针

[但是]

将函数指针转换为 void * 类型是不可移植的

【讨论】:

    【解决方案2】:

    正如您的链接所述:

    本身声明为void的变量(如上面的my_variable)是没用的;它不能被赋值,不能被强制转换为另一种类型,事实上,不能以任何方式使用。

    这意味着尽管语法正确,void 声明对任何事情都没有用,这就是为什么 GCC 会认为它是错误的。即使它可以编译,你也无法对变量做任何事情,所以我猜你的问题只是与测试这种行为有关。

    事实上,void 在我们讨论指针时很有用 (void*),因为它允许您在不指定类型的情况下声明通用指针。

    【讨论】:

    • void 也可用作返回类型。
    • 也可用作强制转换来抑制有关忽略返回值的警告
    【解决方案3】:

    虽然这本书指出void a; 是一个有效的声明,但我不认为它符合标准。话虽这么说,这本书的第一版是 1987 年的,所以它也可以从旧的 GCC 实现中继承下来。

    【讨论】:

      【解决方案4】:

      void *x; 是一个有效的声明。

      void x; 不是有效语句。

      返回指向 void 的指针的函数也是有效的。

      为什么会这样?

      在函数中声明变量时,编译器必须为变量分配内存空间。但是当一个变量是 void 类型时,编译器不知道要为这个变量分配多少字节。所以这对编译器不起作用。 但是,指向 void 的指针是不同的。指针可以是 void 类型,在读取时可以读取为 int、double、float、short 或 char。在这种情况下,需要显式类型转换或自动类型提升由编译器完成。

      例如

      int
      function_A( void *x )
      {
          int *p = (int *)x; 
          return *p;
      }
      
      double
      function_B( void *x )
      {
          double *p = (double *)x; 
          return *p;
      }
      

      重要说明:C 不允许对 void 指针的取消引用进行直接类型转换。 我的意思是你不能这样做:

      double
      function_B( void *x )
      {
          return (double)*x; 
      }
      

      从概念上讲,这是完全合理的。但是 C 不允许这样做。

      【讨论】:

      • 始终预览您的帖子,以便查看您犯的任何错误,例如忽略代码块前的空白行。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-21
      • 1970-01-01
      • 1970-01-01
      • 2012-11-06
      • 1970-01-01
      相关资源
      最近更新 更多