您好在我的代码中找不到错误。我仍然是编程新手。所以,请不要对我这么刻薄。
编译器说:
Line: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;
}
该错误信息是因为宏上的括号不平衡:
//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
并可以通过简单地在第四个结束括号之后放置另一个结束括号来进行修复,假设该表达式的含义是:
而且您真的不想在结尾加上分号,一个更好的例子是(但请参见下文):
#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
为10,第二个计算(但丢弃)表达式+ 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))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句