场景:不同文件中使用同名宏定义,但值不同。
IFoo.h定义TAG为FOO
#pragma ONCE
class IFoo
{
public:
virtual void add() = 0;
};
#define TAG "FOO"
FooA.h定义TAG为FOOA
#pragma ONCE
#include <iostream>
#include <IFoo.h>
class FooA : public IFoo
{
public:
FooA();
~FooA();
public:
void add();
};
#ifdef TAG
#undef TAG
#define TAG "FOOA"
#endif
#include "FooA.h"
#include <iostream>
using namespace std;
FooA::FooA()
{
std::cout << "FooA()" << std::endl;
}
FooA::~FooA()
{
std::cout << "~FooA()" << std::endl;
}
void FooA::add()
{
std::cout << "FooA::add() " << TAG << std::endl;
}
FooB.h定义TAG为FOOB
#pragma once
#include <IFoo.h>
class FooB : public IFoo
{
private:
/* data */
public:
FooB(/* args */);
~FooB();
public:
void add();
};
#ifdef TAG
#undef TAG
#define TAG "FOOB"
#endif
#include "FooB.h"
#include <iostream>
using namespace std;
FooB::FooB(/* args */)
{
std::cout << "FooB()" << std::endl;
}
FooB::~FooB()
{
std::cout << "~FooB()" << std::endl;
}
void FooB::add()
{
std::cout << "FooB::add() " << TAG << std::endl;
}
测试入口函数
#pragma ONCE
#include <iostream>
#include <FooB.h>
#include <FooA.h>
using namespace std;
int main(int argc, char **argv)
{
std::cout << "main()" << std::endl;
FooA *fooA = new FooA();
FooB *fooB = new FooB();
fooA->add();
fooB->add();
fooA->add();
fooB->add();
return 0;
}
输出
main()
FooA()
FooB()
FooA::add() FOOA
FooB::add() FOOB
FooA::add() FOOA
FooB::add() FOOB