【问题标题】:invalid type argument of unary '*' (have double)一元'*'的无效类型参数(有双)
【发布时间】:2019-04-08 07:38:55
【问题描述】:

刚开始学习c++就出现这个错误:

C:\Users\KC\Documents\Math.cpp|9|error: invalid type argument of unary '*' (have 'double')|

这是代码:

#include <iostream>
#include <cmath>
#define M_PI
using namespace std;

int main()
{
   double area, radius = 1.5;
      area = M_PI * radius * radius;
   cout << area << "\n";
}

谁能向我解释我做错了什么。谢谢

【问题讨论】:

  • 您没有为 M_PI 设置值。另见stackoverflow.com/questions/6563810/…。如果没有 M_PI 的值,您的区域分配将简单地变为“区域 = * 半径 * 半径”。因此出现错误。
  • 你使用的是哪个编译器?
  • 一些标准库在包含 时定义了自己的M_PI。我强烈建议您选择不同的名称,否则您会要求冲突和未定义的行为。
  • @chris 碰撞的M_PI 预处理器符号应该如何导致未定义的行为?
  • @user463035818,我记错了。是的,你会得到一个编译器错误,这对于让程序可移植并不理想,但比 UB 更好。 (我相信我把它和多个 ODR-related 定义混在一起了。)

标签: c++


【解决方案1】:
#define M_PI

应该是

#define M_PI 3.14159

(或您想为 pi 赋予的任何值)。

你将M_PI定义为空,也就是说这段代码

  area = M_PI * radius * radius;

变成这个代码

  area = * radius * radius;

您的编译器正在抱怨意外的*

【讨论】:

  • 这就是为什么constexpr double M_PI 会更好的原因之一。你不能忘记赋值
  • 是的,这就是问题所在,谢谢!
【解决方案2】:

我建议使用:

#define _USE_MATH_DEFINES
#include <cmath>

并删除这一行:

#define M_PI

此答案中的更多信息:M_PI works with math.h but not with cmath in Visual Studio

【讨论】:

  • +1 最佳答案,因为没有人应该重新定义 pi。虽然它在 Visual Studio 中不起作用,这很令人沮丧。
【解决方案3】:

您使用了预处理器指令 #define M_PI,它将 M_PI 定义为空字符串。因此,在将空内容替换为 M_PI 后,表达式

area = M_PI * radius * radius

成为

area = * radius * radius

第一个星号变成一元运算符,整个表达式解释为

area = (* radius) * radius

那个一元星号不能合理地与 double 参数一起使用,因此会出现错误消息。

【讨论】:

    猜你喜欢
    • 2021-10-15
    • 2011-12-10
    • 2016-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-20
    相关资源
    最近更新 更多