C中的void语句有什么作用?

时间:2012-06-27 22:48:13

标签: c syntax void

void;放在一行上做什么?编译器警告它,但我不明白。能够将虚空放在这样的一条线上有什么意义呢?

#include <stdio.h>

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

EH

$ 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;

删除了空洞,因为它引起了不必要的讨论。

7 个答案:

答案 0 :(得分:2)

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

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

在第二个语句中,(void)强制转换使您的意图明确放弃返回值。另一个常见用途是使一些静态分析工具(如Lint)静音。

答案 1 :(得分:2)

这个问题让我感兴趣,因为我的第一个想法是K&amp; R.我回到了我的旧K&amp; R书(附录A第192页),找到了有关声明的简介(转录):

8. Declarations

Declarations are used to specify the interpretation which C gives to each identifier; they do not necessarily reserve storage associated with the identifier. Declarations have
the form
    declaration:
        decl-specifier declarator-listopt;

The declarators in the declarator-list contain the identifiers being declared. The decl-specifiers consist of a sequence of type and storage class specifiers.
    decl-specifiers:
        type-specifier decl-specifiersopt
        sc-specifier decl-specifiersopt

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

要在后续页面上添加此混淆,它会列出一组合法的类型说明符值, void 不是其中之一。

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

答案 2 :(得分:1)

void;

没有必要这样做,它没有做任何事情。

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

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

<强>更新

看起来你添加了另一行:

(void)printf("word dude");

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

您通常不会将此用于常用功能,但您也可以使用其他功能。

答案 3 :(得分:0)

如果您使用void或任何其他类型更改int,则会显示相同的错误。

void是一种类型,它需要在该类型之后的东西。完全没有任何意义,因为只编写int后没有变量(或函数)名称。

答案 4 :(得分:0)

void在C中被用作数据类型,并且想到它,我从来没有听说过C语言中的NOP汇编语言等等,所以在一行上自身无效可能是一个错误。

答案 5 :(得分:0)

您确定这是确切的/逐字的文字吗?

该行:

int main() {

应该是

int main(void) {

这意味着您的程序不接受命令行参数(即:如果您的最终程序名为out.exe,则不能传递参数,如out.exe -a -c等)。

此外,您可以使用void-cast来告诉编译器您有意忽略函数的输出。日志语句函数就是一个很好的例子。

例如:

int log(int val) {
  printf("Value is %d \n");
  if (val < 0 ) {
    printf("Value is negative; error!\n");
    return -1;
  } else {
    printf("Value is non-negative; Probably not an error!\n");
    return 0;
  }
}

如果您只是想调用此函数以便它执行printf()内容,您应该这样调用它:(void)log(some_int_variable)。这告诉编译器你不关心结果。如果您这样称呼它:log(some_int_variable)您的编译器(以及其他代码分析工具,如PC_LINT)将发出警告,因为您没有使用函数的返回值,并且希望您将结果分配给变量,例如:myInt = log(some_int_variable)

答案 6 :(得分:0)

它看起来像是声明函数参数的旧样式。这相当于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的答案对此案有更准确的定义。

在任何情况下,都不建议这样做,所以我们可以坚持使用“正常”的方式来声明功能吗? :)