以前的问题描述含糊不清,所以我修改了下面的内容。感谢。
我想实现一些像这样的宏:
#define AddVariable(x) \
#define x (++counter)
class Base {
private:
int counter = 0;
}
class Extend : public Base {
public:
void Handler() {
AddVariable(ASDF);
AddVariable(HJKL);
// Here may add more variables.
}
void AnotherHandler() {
// It calls ASDF, HJKL too.
}
}
ASDF和HJKL应该可以通过cpp文件中的所有处理程序获得,所以我必须在宏中定义它(虽然它不是一个好的设计)。但是我应该如何编写适当的宏来实现它(#define不能嵌套在另一个#define中)?还是有另一种更好的实施方式吗?
提前致谢。
更新
潜在的实施是
#define AddVariable(x) \
int x = ++counter;
它有效,但x不是全局的,我必须解决这个问题。
答案 0 :(得分:1)
看起来您正试图将增量器公开给Base
对象的counter
到.cpp文件中的所有函数。
答:这是不可能的。
.cpp文件中的其他函数/对象没有对Base
对象的引用,因此无法更改任何数据。
如果您想维护所有Base
个对象的单个计数器,您可以尝试这样的事情:
class Base {
public:
static void ASDF(){counter++;}
private:
static int counter = 0;
};
这可以从和其他函数调用:
void AnotherHandler() {
Base::ASDF();
}
修改强>
class Base {
protected:
static int counter = 0;
};
class Another : public Base{
public:
Another(){
counter++; // As a child of Base you have access to all of it's protected variables
}
}
答案 1 :(得分:1)
使用std::map
工作吗?
#include <iostream>
#include <map>
#include <string>
class Base {
protected:
void AddVariable(const std::string& name) {
variables[name] = counter++;
}
int& GetVariable(const std::string& name) {
return variables[name];
}
private:
int counter = 0;
std::map<std::string, int> variables;
};
class Extend : Base {
public:
void Handler() {
AddVariable("ASDF");
AddVariable("HJKL");
// May add more variables here ...
}
void AnotherHandler() {
// Use ASDF, HJKL here too
std::cout << GetVariable("ASDF") << std::endl;
std::cout << GetVariable("HJKL") << std::endl;
}
};
int main()
{
Extend e;
e.Handler();
e.AnotherHandler();
}
输出:
0
1
答案 2 :(得分:0)
您无法使用C预处理器执行此操作(在宏中定义宏)。
如果您确实需要宏定义宏,请切换到某些外部或非标准预处理器,例如GNU m4或gpp。
或者,使用一些外部工具(例如您自己的Python或GNU awk脚本)生成C ++代码。
最后,最近GCC(例如GNU cpp)或Clang/LLVM提供__COUNTER__
宏(也可以间接使用stringification&amp; {{3 }})