如何在另一个#define中实现#define?

时间:2014-12-17 14:38:36

标签: c++ macros

以前的问题描述含糊不清,所以我修改了下面的内容。感谢。

我想实现一些像这样的宏:

#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不是全局的,我必须解决这个问题。

3 个答案:

答案 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预处理器执行此操作(在宏中定义宏)。

但是,有时您可以使用X-macrohere技巧。

如果您确实需要宏定义宏,请切换到某些外部或非标准预处理器,例如GNU m4gpp

或者,使用一些外部工具(例如您自己的Python或GNU awk脚本)生成C ++代码。

最后,最近GCC(例如GNU cpp)或Clang/LLVM提供__COUNTER__宏(也可以间接使用stringification&amp; {{3 }})