#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()的私有数据?
感谢您的回答。
答案 0 :(得分:2)
宏在C ++编译的后续阶段开始之前在源代码中执行替换。这里,函数A()出现在源代码中,文本“protected:static int a; int b; string c;”将被替换(假设您的斜杠'/'实际上是反斜杠'\',这是多行宏的行继续符号)。请注意,行继续被单个空格替换 - 而不是它倾向于重要。
无论出现“functionB()”,其文本都将被替换,“functionA()”替换然后在替换文本中进一步展开。
从功能上讲,这些宏恰好注入了包含protected:
和public:
的源代码,因此它们只能在struct
或class
内有效。前者在它出现的类中添加了一些数据成员 - 后者还提供了一些公共虚拟成员函数。
要将代码转换为常规代码,您可以手动执行一次替换然后保存结果文件,或者可能要求编译器为您执行替换...例如,许多编译器将输出预处理(宏 - 当给出“-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...
};