将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;
删除了空洞,因为它引起了不必要的讨论。
答案 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的答案对此案有更准确的定义。
在任何情况下,都不建议这样做,所以我们可以坚持使用“正常”的方式来声明功能吗? :)