为什么要跳过 void 函数调用而不捕获它们?

Why do you skip void function calls without catching them?

我想调用一个计算圆的宽度的函数。

#include <stdio.h>
void area(double*);
int main()
{
    void* vp = NULL;
    double r;
    printf("input value : ");
    scanf(" %lf", &r);
    (double*)vp = &r;
    void area(vp);
}
void area(double* dp)
{
    double result;
    result = (*dp) * (*dp) * (3.14);
    printf("circle are is : %.2lf", result);
    return 1;
}*

我想在 //void area (vp)// 中调用一个函数,但我无法在 visual stdio 中捕获错误并按原样继续。你知道是什么原因吗?

为了调用函数,你写area(vp);不是void area(vp);.

后者出现在函数 main 中,是一个 函数原型 并且没有 运行 时间效应。

并修改 PI 的定义:考虑到您使用 double 类型,您的定义非常不合适。参见 Math constant PI value in C

你应该写

  area(&r);

而不是错误和多余的

 void area(vp);

加上你在语法中犯的明显错误

  • 我不认为 vp 有任何理由在那里。

  • 为确保 scanf() 成功,始终检查调用的 return 值。

  • 引用 C11,章节 §6.8.6.4,

    A return statement with an expression shall not appear in a function whose return type is void. [....]

代码存在三个问题。

对于初学者来说,不清楚为什么指针 vp 被声明为 void * 类型,尽管在程序中它仅用于指向 double 类型的对象。

为什么不像

那样声明呢
double *vp = NULL;

结果这个技巧用指针

(double*)vp = &r;

不会编译,因为在左侧表达式 (double*)vprvalue 并且可能无法分配。

你可以直接写

vp = &r;

第二个问题就是这个语句

void area(vp);

也是无效的。要调用你应该写的函数

area(vp);

第三个问题是 return 类型为 void 的函数不应在 return 语句

中指定表达式

应删除此声明。

return 1;

来自C标准(6.8.6.4 return语句)

1 A return statement with an expression shall not appear in a function whose return type is void. A return statement without an expression shall only appear in a function whose return type is void.

将函数的参数声明为具有引用类型是没有意义的。

函数定义可能类似于

double area( double dp )
{
    const double PI = 3.14;

    return dp * dp * PI;
}

调用 pf printf 的语句应该移到 main

printf( "circle are is : %.2lf", area( r ) );