【问题标题】:What does the void statement in C do?C 中的 void 语句有什么作用?
【发布时间】:2012-06-27 22:48:12
【问题描述】:

在 C 中将void; 放在一行上有何作用?编译器对此发出警告,但我不明白。像这样将 void 放在一条线上有什么意义?

#include <stdio.h>

int main() {
        void;
        printf("word dude");
        return 1;
}

$ gcc -pedantic -ansi -Wall -Wextra eh.c -o eh
eh.c: In function 'main':
eh.c:4:2: warning: useless type name in empty declaration
$ ./eh
word dude

人们似乎对我的问题感到困惑:这条线是什么意思,它有什么作用吗?为什么有效?

void;

删除了 void cast,因为它会引起不必要的讨论。

【问题讨论】:

  • 编译器告诉你,你所做的没有用。那么这里的问题是什么?
  • 真正的问题是:为什么这不是语法错误?
  • @Oil:问题是为什么编译,它是什么意思。
  • @megazord 看到我的回答,这不是 C。你的编译器很友好地接受它,但它没有义务接受。 clang 比如拒绝翻译这个程序。
  • 它编译是因为编译器没有强制执行严格的一致性。它接受空声明,尽管它会警告它们。要获得编译错误,请使用-pedantic-errors 或一般使用-Wall -Wextra -Werror

标签: c syntax void


【解决方案1】:

这个问题引起了我的兴趣,因为我首先想到的是 K&R。我回到我的旧 K&R 书(附录 A p.192)上找到了关于声明的简介(抄本):

8。声明 声明用于指定 C 对每个标识符的解释;它们不一定保留与标识符关联的存储空间。声明有 表格 声明: decl-specifier declarator-listopt; declarator-list 中的声明符包含被声明的标识符。 decl 说明符由一系列类型和存储类说明符组成。 decl 说明符: 类型说明符 decl-说明符opt sc-specifier decl-specifiersopt

这让我相信 delarator 列表是可选的(意味着它可以是空的)。

为了在下一页增加这种混乱,它列出了一组合法的 type-specifier 值,而 void 不是其中之一。

在我狭义的解释中,这可能仍然是合法的(但已过时)C.

【讨论】:

  • 这没有回答问题
  • 好吧,IMO 没有明确的答案。很长一段时间以来,K&R 直到 ANSI C 标准化的参考。 ANSI C 是 K&R 的超集,因此继承了 K&R 的许多怪异之处。当然,它可能不完整,我认为“为什么这个有效”问题的最佳答案是“因为 K&R 这么说”。
【解决方案2】:
      void;                       // 1
      (void)printf("word dude");  // 2

第一个语句是无效语句:这不是 C。

在第二个语句中,(void) 演员表明确了您放弃返回值的意图。另一个常见的用途是使一些静态分析工具(如 Lint)保持沉默。

【讨论】:

    【解决方案3】:
    void;
    

    这样做没有任何意义,它什么也没做。

    你是从书中得到这个吗?一定是搞错了。

    有点不相关,返回值如果0通常用于表示程序正常终止,任何其他值表示有问题(按惯例)

    更新

    看起来你又添加了一行:

    (void)printf("word dude");
    

    这 - 与之前的 void; 不同 - 明确告诉编译器忽略 printf() 函数的返回值(打印的字符数)并防止警告消息在编译器或其他工具上出现挑剔/迂腐设置,像皮棉一样,停止抱怨。

    您通常不会在常用功能中看到这一点,但您可能会看到其他功能。

    【讨论】:

    • 我知道大声笑我输入了 1,因为我正在吃东西,而且更容易被击中
    • @megazord ha ha .. 最好的理由 :).. 无论如何它并没有真正影响这个例子。
    • @megazord 我看到你添加了另一行 void printf(..) .. 我更新了我的答案以包含它。
    【解决方案4】:

    如果您将void 更改为int 或任何其他类型,它会打印相同的错误。

    void 是一种类型,它期望在该类型之后有一些东西。只写int 后面没有变量(或函数)名称,这完全没有意义。

    【讨论】:

      【解决方案5】:

      void 在 C 中用作数据类型,仔细想想,我从未听说过与 C 中的 NOP 等效的汇编语言,因此在一行中单独使用 void 可能是错误的。

      【讨论】:

      • 我不是在问什么是 void,我是在问只有一行写着“void;”是什么意思
      【解决方案6】:

      它看起来像向函数声明参数的旧风格。这相当于int main(void)。有些编译器仍然接受它,有些则不接受。例如,这段代码在我试过的两个编译器中编译:

      void main(i, j) {
          int;
          long;
      
          i = 12;
          j = 123456;
          printf("%d %d\n", i, j);
      }
      

      Untyped arguments in a C function declaration 的答案对这种情况有更准确的定义。

      无论如何,这是不推荐的,所以我们可以坚持“正常”的声明函数的方式吗? :)

      【讨论】:

      • 你展示的不是我所知道的 K&R 风格。在 K&R 风格中,类型在左大括号之前声明,以及它们的名称。在这里,它们在函数内部定义,没有名称。它是另一种定义风格吗?或者i,j默认是int,而int;long;被忽略?
      猜你喜欢
      • 1970-01-01
      • 2016-08-02
      • 2011-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-31
      • 2012-12-09
      • 2015-02-12
      相关资源
      最近更新 更多