0

#define 编译器指令对我来说似乎很奇怪。我读过没有分配内存

#include <iostream>
#define test 50
int main()
{
    cout<<test;
   return 0;
}

即使没有为编译器指令#define 分配内存,上述函数也会显示 50

编译器如何知道 50 存储在其中(测试)而没有任何内存。

4

2 回答 2

5

与变量不同。

您的编译器将翻译程序

#include <iostream>
#define test 50
int main()
{
   cout << test;
   return 0;
}

#include <iostream>
int main()
{
   cout << 50;
   return 0;
}

通过将名称替换为您在声明中test给出的值。#define您可能想查看一些可以在 Internet 上找到的教程,例如:

#define getmax(a,b) ((a)>(b)?(a):(b))

这将用替换表达式替换任何出现的 getmax 后跟两个参数,但也会用其标识符替换每个参数,正如您所期望的那样,如果它是一个函数:

// function macro
#include <iostream>
using namespace std;

#define getmax(a,b) ((a)>(b)?(a):(b))

int main()
{
  int x=5, y;
  y= getmax(x,2);
  cout << y << endl;
  cout << getmax(7,x) << endl;
  return 0;
}
于 2014-12-09T16:17:37.067 回答
3

实际上,test它将被编译之前50在代码中遇到的任何地方替换。因为替换不是在运行时完成的,所以没有开销。

于 2014-12-09T16:17:17.960 回答