使用默认值在标头中定义静态整数

时间:2017-08-20 15:08:59

标签: c++

如何在头文件中定义一个整数,以便包含头文件的每个cpp文件都具有static const int id=0,同时使cpps能够使用其他值重新定义它。

我尝试使用弱符号,但无法使其正常工作。

2 个答案:

答案 0 :(得分:1)

如果您对预处理器定义没问题,可以这样做:

// header.h
#ifndef CLASSID
#define CLASSID 0
#endif
static int id=CLASSID;

// class.cpp
#define CLASSID 1
#include "header.h"

这样一来,源文件可以覆盖默认值,但也可以省略它,这就是你提到的那种方法。

答案 1 :(得分:0)

这是另一个使用静态变量的解决方案:

// log.h
#ifndef LOG_H
#define LOG_H
#include <iostream>
#define SETLOGID(v) static logidsetter _logidsetter(_logid, v);
#define LOG(v) std::cout << "id: " << _logid << ": " << (v) << std::endl;

class logidsetter
{
public:
    logidsetter(int &id, int val)
    {
        id = val;
    }
};
static int _logid = 0;
#endif

// myclass.h
class myclass
{
    public:
    myclass();
    void run(void);
};

// myclass.cpp
#include "log.h"
#include "myclass.h"

SETLOGID(42)

myclass::myclass()
{
    LOG("myclass::cons");
}

void myclass::run(void)
{
    LOG("myclass::run");
}

// main.cpp
#include "myclass.h"
#include "log.h"

SETLOGID(1)

int main()
{
    myclass mc;
    LOG("here's main");
    mc.run();
}

日志标头定义静态int _logid并提供宏SETLOGID和类idsetter。 cpp文件可以使用SETLOGID来重新定义静态值。这是通过类idsetter的实例化以及_logid的地址和期望值来完成的。这个技巧允许绕过C ++的One Definition Rule

输出如下:

id: 42: myclass::cons
id: 1: here's main
id: 42: myclass::run