它是什么? C ++宏功能?如何更换这个宏?我能举个例子吗?

时间:2014-01-07 06:59:14

标签: c++ macros

#define functionA()\
protected:\
static int a;\
int b;\
string c;

#define functionB()\
functionA()\
public:\
virtual int getvalue_a(){return a;}\
virtual void setvalue_b(int VB){b = VB; }\
virtual int get value_b(){return b;}

我想将这种代码转换为常规代码。我想用class或regular函数来替换宏。

但我不知道“functionA()”和“functionB()”之间的关系是什么,它们是不是存在吗?或“functionA()”是functionB()的私有数据?

感谢您的回答。

1 个答案:

答案 0 :(得分:2)

宏在C ++编译的后续阶段开始之前在源代码中执行替换。这里,函数A()出现在源代码中,文本“protected:static int a; int b; string c;”将被替换(假设您的斜杠'/'实际上是反斜杠'\',这是多行宏的行继续符号)。请注意,行继续被单个空格替换 - 而不是它倾向于重要。

无论出现“functionB()”,其文本都将被替换,“functionA()”替换然后在替换文本中进一步展开。

从功能上讲,这些宏恰好注入了包含protected:public:的源代码,因此它们只能在structclass内有效。前者在它出现的类中添加了一些数据成员 - 后者还提供了一些公共虚拟成员函数。

要将代码转换为常规代码,您可以手动执行一次替换然后保存结果文件,或者可能要求编译器为您执行替换...例如,许多编译器将输出预处理(宏 - 当给出“-E”或“/ E”命令行选项时,代码。不幸的是,这也会影响所有其他预处理器更改(包括标题的#include),因此仅剪切和粘贴所需的替换可能是相当大的工作。

例如:

class X
{
    ...whatever stuff...
    functionA()
    ...whatever stuff...
};

...可以替换为......

class X
{
    ...whatever stuff...
  protected:
    static int a;
    int b;
    string c;
    ...whatever stuff...
};

虽然functionB的使用扩展了类似......

struct Y
{
    ...whatever stuff...
    functionB()
    ...whatever stuff...
};

...到...

struct Y
{
    ...whatever stuff...
  protected:
    static int a;
    int b;
    string c;
  public:
    virtual int getvalue_a(){return a;}
    virtual void setvalue_b(int VB){b = VB; }
    virtual int get value_b(){return b;}
    ...whatever stuff...
};