如何在头文件中定义一个整数,以便包含头文件的每个cpp文件都具有static const int id=0
,同时使cpps能够使用其他值重新定义它。
我尝试使用弱符号,但无法使其正常工作。
答案 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