【C/C++】define宏名重复定义

场景:不同文件中使用同名宏定义,但值不同。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值