乘法时非法间接

kar*_*una 3 c++ visual-c++

我开始学习C++了.这是我遇到的一个问题:

#include <iostream>
using namespace std;
#define PI 3.14;

int main(){
    double r = 5.0;
    double circle;
    double inp;

    circle = 2 * PI * r;
    cout << circle;
    cin >> inp;
}
Run Code Online (Sandbox Code Playgroud)

它显示错误:error C2100: illegal indirection.我用谷歌搜索但没有找到答案.谢谢

Ric*_*ett 11

#define PI 3.14;
Run Code Online (Sandbox Code Playgroud)

;是错的,删除它.

顺便说一句,你的行扩展为circle = 2 * 3.14; * r; 所以编译器然后抱怨*r,这解释了错误消息.

  • 更好的是,将它改为`const double PI = 3.14;`.不必要的宏是一个坏主意,即使你设法避免所有的句法死亡陷阱. (8认同)

pax*_*blo 6

宏是(相对)简单的替换,所以,当你写:

#define PI 3.14;
circle = 2 * PI * r;
Run Code Online (Sandbox Code Playgroud)

它实际上最终为:

circle = 2 * 3.14; * r;
Run Code Online (Sandbox Code Playgroud)

实际上有两个陈述:

circle = 2 * 3.14;
* r;
Run Code Online (Sandbox Code Playgroud)

如果r是某个描述的指针,那最后一行将是一个完全有效的表达式(尽管它不是非常有用的表达式).然而,鉴于它是一个双倍,这是你从非法间接的地方.

除非在非常特殊的情况下,否则现在通常应该避免使用宏.使用它们来提供内联函数主要由inline关键字("大多数")包含,因为inline关键字只是一个建议.

此外,使用它来提供常量可以通过const关键字更好地完成(具有完整类型支持和通常更好的调试的优点).

换句话说,你的PI常量会更好地写成:

const double PI = 3.141592653589;
Run Code Online (Sandbox Code Playgroud)

我现在使用预处理器的唯一地方就是条件编译.


除此之外,你可能意味着circumference而不是circle.前者是圆圈外侧的长度,后者根本不是长度值.