如何使用相同的宏确保不同的C++代码库?

Zij*_*gWu 6 c++ macros

我们是在两个工作C++的代码基础,让我们把它叫做一个一个是构建作为一个库,并分发头文件.h.a文件到.

假设A中Lock.h文件如下:

// Lock.h in code base A
class Lock {
    ... ...
#ifdef TRACK_THREAD_OWNER_FOR_DEBUG
    virtual int GetLockOwner();
#endif
    ... ...
private:
    CriticalSection section;
#ifdef TRACK_THREAD_OWNER_FOR_DEBUG
    int threadOwner;
#endif
};

// Caller.cc in code base B
#include "xxx/xxx/Lock.h"
Lock lockObject;
lockObject.Lock();
Run Code Online (Sandbox Code Playgroud)

在代码库A中,我们默认启用TRACK_THREAD_OWNER_FOR_DEBUG并可能在最终发布日之前更改它.

我们遇到了一些难题,因为ABTRACK_THREAD_OWNER_FOR_DEBUG不同,导致内存损坏,因为两个库不同.sizeof(Lock)

那么如何防止这个错误呢?caller.cc如果构建宏TRACK_THREAD_OWNER_FOR_DEBUG在两个项目中不同,我们可以在构建文件时触发编译器错误吗?

use*_*670 6

不可能将此转换为编译器错误,但是应该可以使用静态保护变量将其变为合理清晰的链接器错误:

//  Foo.hpp - library header file
#pragma once

class Foo
{
    public: Foo();
#ifdef VTT_CONDITION
    int m_field;
#endif
};

class ConditionGuard
{
    public:
    ConditionGuard(void) noexcept
    {
    #ifdef VTT_CONDITION
        CONDITION_ON();
    #else
        CONDITION_OFF();
    #endif
    }

#ifdef VTT_CONDITION
    private: static void CONDITION_ON(void);
#else
    private: static void CONDITION_OFF(void);
#endif
};

static ConditionGuard const condition_guard{};

// Foo.cpp - library implementation file 
#include "Foo.hpp"

Foo::Foo(void) {}

#ifdef VTT_CONDITION
void ConditionGuard::CONDITION_ON(void) {}
#else
void ConditionGuard::CONDITION_OFF(void) {}
#endif
Run Code Online (Sandbox Code Playgroud)

现在,当用户代码包含库头时,Foo.hpp它还将触发condition_guard静态变量的构造,该静态变量将根据受保护的条件调用库函数.所以,如果有包括翻译单元Foo.hpp,其中VTT_CONDITION不同的定义比编译库,然后会有丢失链接错误CONDITION_ONCONDITION_OFF.CONDITION_ONCONDITION_OFF函数名称应包含错误文本.