4

在 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,因为它会引起不必要的讨论。

4

6 回答 6

2
      void;                       // 1
      (void)printf("word dude");  // 2

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

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

于 2012-06-27T23:04:48.477 回答
2

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

8. 声明

声明用于指定 C 对每个标识符的解释;它们不一定保留与标识符关联的存储空间。声明有
表格
    声明:
        decl-specifier declarator-list opt 

declarator-list 中的声明符包含被声明的标识符。decl 说明符由一系列类型和存储类说明符组成。
    decl-specifiers: 
        type-specifier decl-specifiers opt
         sc-specifier decl-specifiers opt

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

为了在下一页增加这种混乱,它列出了一组合法的类型说明符值,而void不是其中之一。

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

于 2012-06-28T05:44:10.957 回答
1
void;

这样做没有意义,它没有任何作用。

你是从一本书里弄出来的吗?一定是个错误。

有点不相关,返回值 if0通常用于表示程序正常终止,任何其他值表示有问题(按约定)

更新

看起来您添加了另一行:

(void)printf("word dude");

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

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

于 2012-06-27T22:48:47.930 回答
0

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

void是一种类型,它期望在该类型之后有一些东西。它根本没有任何意义,因为int它后面没有变量(或函数)名称。

于 2012-06-27T22:53:24.150 回答
0

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

于 2012-06-27T22:57:49.637 回答
0

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

void main(i, j) {
    int;
    long;

    i = 12;
    j = 123456;
    printf("%d %d\n", i, j);
}

C 函数声明中无类型参数的答案对这种情况有更精确的定义。

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

于 2012-06-27T23:37:55.263 回答