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

卡斯帕·西里连科(Kaspar Siricenko)

您好在我的代码中找不到错误。我仍然是编程新手。所以,请不要对我这么刻薄。

编译器说:

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么以下代码无法解析?

来自分类Dev

Java类型清除:为什么以下代码段无法编译?

来自分类Dev

为什么clang ++不编译以下代码?

来自分类Dev

为什么以下代码编译和执行成功?

来自分类Dev

为什么clang ++不编译以下代码?

来自分类Dev

为什么以下代码可以编译并成功运行?

来自分类Dev

为什么以下代码段无法成功运行?

来自分类Dev

为什么以下代码无法按预期执行?

来自分类Dev

为什么以下代码会运行?

来自分类Dev

为什么以下代码显示错误?

来自分类Dev

为什么以下代码不终止?

来自分类Dev

为什么以下代码使用`c ++ 03`而不是`c ++ 11`进行编译

来自分类Dev

为什么以下代码使用clang而不是gcc进行编译

来自分类Dev

为什么以下代码使用`c ++ 03`而不是`c ++ 11`进行编译

来自分类Dev

为什么在以下代码中无法投射类型为'WhereSelectEnumerableIterator的对象?

来自分类Dev

为什么在以下代码段中无法访问from的变量值?

来自分类Dev

为什么他的以下代码无法在链表中的特定位置插入节点?

来自分类Dev

无法理解为什么在运行以下代码时应用程序崩溃

来自分类Dev

以下代码段的输出是什么,为什么?

来自分类Dev

以下代码的输出是什么,为什么?

来自分类Dev

为什么以下代码会导致无限递归?

来自分类Dev

为什么以下代码打印出10而不是null?

来自分类Dev

Sailsjs:以下代码中为什么不使用* return *?

来自分类Dev

以下代码不起作用..为什么?

来自分类Dev

为什么以下代码导致模板实例化?

来自分类Dev

为什么以下代码在C ++中是非法的

来自分类Dev

为什么以下代码给出此输出?

来自分类Dev

为什么在以下代码中出现竞争条件?

来自分类Dev

为什么我将nan作为以下代码的输出?

Related 相关文章

  1. 1

    为什么以下代码无法解析?

  2. 2

    Java类型清除:为什么以下代码段无法编译?

  3. 3

    为什么clang ++不编译以下代码?

  4. 4

    为什么以下代码编译和执行成功?

  5. 5

    为什么clang ++不编译以下代码?

  6. 6

    为什么以下代码可以编译并成功运行?

  7. 7

    为什么以下代码段无法成功运行?

  8. 8

    为什么以下代码无法按预期执行?

  9. 9

    为什么以下代码会运行?

  10. 10

    为什么以下代码显示错误?

  11. 11

    为什么以下代码不终止?

  12. 12

    为什么以下代码使用`c ++ 03`而不是`c ++ 11`进行编译

  13. 13

    为什么以下代码使用clang而不是gcc进行编译

  14. 14

    为什么以下代码使用`c ++ 03`而不是`c ++ 11`进行编译

  15. 15

    为什么在以下代码中无法投射类型为'WhereSelectEnumerableIterator的对象?

  16. 16

    为什么在以下代码段中无法访问from的变量值?

  17. 17

    为什么他的以下代码无法在链表中的特定位置插入节点?

  18. 18

    无法理解为什么在运行以下代码时应用程序崩溃

  19. 19

    以下代码段的输出是什么,为什么?

  20. 20

    以下代码的输出是什么,为什么?

  21. 21

    为什么以下代码会导致无限递归?

  22. 22

    为什么以下代码打印出10而不是null?

  23. 23

    Sailsjs:以下代码中为什么不使用* return *?

  24. 24

    以下代码不起作用..为什么?

  25. 25

    为什么以下代码导致模板实例化?

  26. 26

    为什么以下代码在C ++中是非法的

  27. 27

    为什么以下代码给出此输出?

  28. 28

    为什么在以下代码中出现竞争条件?

  29. 29

    为什么我将nan作为以下代码的输出?

热门标签

归档