【问题标题】:Using a variable inside a Macro in C++在 C++ 的宏中使用变量
【发布时间】:2019-04-12 03:04:18
【问题描述】:

我遇到了以下宏,我无法理解它到底在做什么;

#include <iostream>
#define TEST(a1) \
  int a1 = 5; 

int main(){

   TEST(a1);
   std::cout << a1  << std::endl;

   return 0;
}

它编译并打印5

我在一定程度上了解宏,但我无法理解这里发生的事情。对我来说TEST 看起来像是一个正在重新定义其参数a1 的函数?

【问题讨论】:

  • 在 C 和 C++ 中,宏的行为就像一个愚蠢的复制“n”粘贴(除非您执行诸如字符串化或令牌连接之类的操作)。当您“调用”宏时传递的令牌只是作为宏扩展的一部分粘贴到语句int a1 = 5; 中。如果你使用 GCC 或 Clang,你可以试试running just the preprocessor and looking at the output to see what's happening
  • @Cornstalks 啊抱歉我已经删除了那部分,这是我这边的一个错误。但我仍然不明白发生了什么。这里复制了什么?最终结果是什么
  • -E 选项将使 gcc/clang 仅运行预处理器,并将发出最终处理的代码(在编译之前)。我建议使用 gcc.godbolt.org 作为探索宏及其扩展内容的简单方法(但请注意:如果您 #include 是一个文件,那么您正在享受一种享受 :))。

标签: c++ macros


【解决方案1】:

宏只是将宏中定义的代码放在您通过preprocessor调用宏的任何位置

基本上归结为这段代码:

#include <iostream>
#define TEST(a1) \
  int a1 = 5; 

int main(){

   TEST(a1);
   std::cout << a1  << std::endl;

   return 0;
}

变成这样的代码:

#include <iostream>

int main(){

   int a1 = 5; 
   std::cout << a1  << std::endl;

   return 0;
}

有效。

宏的优点是您可以多次使用它。而且,由于我们的示例是参数化的,我们可以使用它进行细微的变化。所以,例如,这段代码:

#include <iostream>
#define TEST(a1) \
  int a1 = 5; 

int main(){

   TEST(a1);
   std::cout << a1  << std::endl;

   TEST(a2);
   std::cout << a2  << std::endl;

   TEST(a3);
   std::cout << a3  << std::endl;

   return 0;
}

变成:

#include <iostream>

int main(){

   int a1 = 5; 
   std::cout << a1  << std::endl;

   int a2 = 5; 
   std::cout << a2  << std::endl;

   int a3 = 5; 
   std::cout << a3  << std::endl;

   return 0;
}

你可以用宏做很多事情,我建议你研究它们,但这会让你开始。

编辑:另外值得一提的是,如果您愿意,可以将此宏更改为:

#define TEST(a1,val) \
  int a1 = val; 

这样,您可以根据需要独立控制初始化值。所以:

TEST(a4,8)

变成:

int a4 = 8;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    • 2017-11-29
    相关资源
    最近更新 更多