为什么以下代码无法编译?

时间:2015-04-17 07:56:32

标签: c macros

你好我的代码中找不到错误。 我还是编程的新手。所以请不要对我这么吝啬。

编译器说:

  

行:23错误:预期')'之前';'令牌

     

行:24错误:预期';'在')'令牌之前

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <windows.h>

#include <stdbool.h>
#include <time.h>
#include <unistd.h>

#define CENTER(a,b,x,y,g)       g*sqrt(pow((x-a),2.0)+pow((y-b),2.0);

int size=5,location_x=10,location_y=10,s=NULL,l_x, l_y, status=2;

int main(void)
{
    srand(time(NULL));
    float location[l_x][l_y];
    int x[size], y[size], z[size];

    l_x=1+rand()%100;
    l_y=1+rand()%100;

    for (int i=0; i<size; i++){
        location[l_x][l_y] += CENTER(x[i], y[i], location_x, location_y, z[i]);
    }
    return 0;
}

4 个答案:

答案 0 :(得分:10)

错误消息是因为宏上的括号不平衡:

//opening ->                    1   23             45
#define CENTER(a,b,x,y,g) g*sqrt(pow((x-a),2.0)+pow((y-b),2.0);
//closing ->                             1    2         3    4

并且可以通过简单地在第四个关闭括号之后放置另一个右括号来修复,假设表达式意图是:
enter image description here

你真的想要在它的末尾加上一个分号,一个更好的例子是(但见下文):

#define CENTER(a,b,x,y,g) g*sqrt(pow((x-a),2.0)+pow((y-b),2.0))

如果您在声明结尾之外的任何地方使用宏,那么分号尤其令人讨厌,幸运的是,您没有这样做,但在未来的某个时候可能会很好。例如,这个结构将使用分号隐藏失败:

x = CENTER(1,2,3,4,5)+42;

阴险,因为它编译,但不会按照您的想法行事,例如,以下代码将打印出来100

#include <stdio.h>
#define FN(x) (x);
int main (void) {
    int xyzzy = FN(10) + 90;
    printf ("%d\n", xyzzy);
    return 0;
}

那是因为,在预处理之后,你最终会得到:

    int plugh = (10); + 90;

实际上是两个有效的C语句,第一个设置xyzzy到十,第二个评估(但丢弃)表达式+ 90


然而(这是上面提到的“见下文”位),我会进一步说你可能不应该在这里使用宏。宏的三个主要用例(从C的早期开始)通常可以分为:

  • 条件编译;
  • 内联代码;和
  • 常数。

第二个通常因为疯狂地优化编译器而过时,第三个没有枚举那么有用(除非你想传递编译时可配置的常量,如gcc -DUNITS_PER_BIN=42 ...),我建议条件编译是你现在唯一应该使用宏的地方。

相反,我只是使用函数:

inline float center (float a, float b, float x, float y, float g) {
    return g * sqrt (pow ((x - a), 2.0) + pow ((y - b), 2.0);
}

(但如果可能,请提供更多描述性变量)。

我现在通常甚至不使用inline,因为编译器通常可以解决它,但我已经把它放在那里以便完整。

这也消除了许多类似函数的宏的问题,例如当你传递var + 7之类的东西作为你的(未加表达式的)g变量时,发现表达式没有给出你想要的是因为运营商的优先权:

var + 7 * sqrt (pow ((x - a), 2.0) + pow ((y - b), 2.0))

当你真正想要的是:

(var + 7) * sqrt (pow ((x - a), 2.0) + pow ((y - b), 2.0))

答案 1 :(得分:3)

也许这就是:

#define CENTER(a,b,x,y,g)       g*sqrt(pow((x-a),2.0)+pow((y-b),2.0);

...需要一个额外的括号来关闭表达式,如下所示:

#define CENTER(a,b,x,y,g)       g*sqrt(pow((x-a),2.0)+pow((y-b),2.0))

您还应该删除尾部分号。

答案 2 :(得分:2)

)

末尾需要一个g*sqrt(pow((x-a),2.0)+pow((y-b),2.0);

使用

#define CENTER(a,b,x,y,g)    g*sqrt(pow((x-a),2.0)+pow((y-b),2.0))
                                                                 ^

并在最后删除;

答案 3 :(得分:0)

创建一个使用#define的常量,但是这个语句不希望它背后有;个符号的calcolation。也就是说你在陈述结尾处遗漏了)