【发布时间】:2020-01-06 12:54:52
【问题描述】:
如果原型double cubenum(); 未在 C 中按要求声明,则如预期的那样,以下代码会生成错误。
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("Answer is: %f", cubenum(3.0));
return 0;
}
double cubenum(double number){
double result = number * number * number;
return result;
}
而如果上面的 cubenum 定义被替换为以下定义而不返回,那么当未声明 cubenum 原型时它不会产生任何错误:
void cubenum(double number){
double result = number * number * number;
printf("Answer is: %f", result);
}
当原型被声明为 void cubenum();上面的 cubenum 定义没有返回它会产生以下错误:
||=== Build: Debug in xxx(compiler: GNU GCC Compiler) ===|
C:\xxx\main.c||In function 'main':|
C:\xxx\main.c|10|error: invalid use of void expression|
||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
第 10 行在测试时为:printf("Answer is: %f", cubenum(3.0));
所以,问题是:
为什么没有返回的函数,原型声明是不需要的,如果在上面的例子中声明会出错?
GCC 版本信息
gcc (MinGW.org GCC-6.3.0-1) 6.3.0
【问题讨论】:
-
关于最后一个错误,不返回值的函数的返回值怎么用? (比如,如果
cubenum没有返回任何内容,printf("Answer is: %f", cubenum(3.0))会打印什么?) -
@Ayxan 有关系,但不会回答这个问题。
-
@Ayxan 如果我没看错,这与前向声明无关。 OP 询问为什么最后一个不会像第一个那样产生错误。 OP 预计会出现错误,而不是相反。
-
@Ayxan 请再读一遍我说的话。是的,从技术上讲,它是相对于 C2011 的扩展,但只要它是所有三个最常用的 C 编译器都接受的默认编译模式的扩展,每个不是语言律师的人自然会认为它是是C语言的一部分,告诉他们它不是只会让他们感到困惑。迂腐是一种糟糕的教学法。