C ++中编译器指令的工作[重复]

Posted

技术标签:

【中文标题】C ++中编译器指令的工作[重复]【英文标题】:Working of the compiler directive in C++ [duplicate] 【发布时间】:2014-12-09 16:13:26 【问题描述】:

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

#include <iostream>
#define test 50
int main()

    cout<<test;
   return 0;

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

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

【问题讨论】:

宏在编译时执行简单的文本替换。出现“test”的所有地方,编译器都会替换为“50”。所以程序的工作方式与您编写cout&lt;&lt;50; 完全相同 另外,因为这是 C++,所以你真的应该使用 const int test = 50;。我们在标准化 C++ 时努力工作以使 #define 几乎没有必要。 【参考方案1】:

Macros 与变量不同。

你的编译器会翻译程序

#include <iostream>
#define test 50
int main()

   cout << test;
   return 0;

#include <iostream>
int main()

   cout << 50;
   return 0;

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

#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;

【讨论】:

内容丰富:) 肯定会看一些教程!【参考方案2】:

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

【讨论】:

以上是关于C ++中编译器指令的工作[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Go中的预处理器指令就像C中的一样[重复]

在英特尔 PIN 中跟踪本机指令 [重复]

Mac OS X系统下编译运行C代码

linux pwd指令的C实现

printf() 在没有双引号的情况下工作,打印随机字符 [重复]

C ++如何在幕后工作[重复]