gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:30:01 25 4
gpt4 key购买 nike

我们正在开发两个C++代码库,我们称之为ABA是一个构建为一个库,并将头文件.h.a文件分发到B

假设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();

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

我们遇到了一些严重的错误,因为 TRACK_THREAD_OWNER_FOR_DEBUGAB 中不同,并且由于 sizeof(Lock ) 在两个库中是不同的。

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

最佳答案

不可能将它变成编译器错误,但是通过导出一些名称取决于当前定义的宏的符号,应该可以将它变成相当清晰的链接器错误。例如使用静态保护变量:

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

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

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

#ifdef IMPORTANT_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 IMPORTANT_CONDITION
void ConditionGuard::CONDITION_ON(void) {}
#else
void ConditionGuard::CONDITION_OFF(void) {}
#endif

现在,当用户代码包含库头 Foo.hpp 时,它还会触发 condition_guard 静态变量的构造,该变量将根据 protected 条件调用库函数。因此,如果有一个包含 Foo.hpp 的翻译单元,其中 IMPORTANT_CONDITION 的定义与编译库中的定义不同,那么将出现缺少 CONDITION_ON 的链接器错误> 或 CONDITION_OFFCONDITION_ONCONDITION_OFF 函数名称应包含错误文本。

关于c++ - 如何确保不同的 C++ 代码库使用相同的宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45873920/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com