如何确保使用相同的宏的不同C++代码库?
How to make sure different C++ code base using the same macro?
我们正在研究两个C++
代码库,我们称之为A和B,A是一个构建库,并将头文件.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
,并可能在最终发布日之前对其进行更改。
我们遇到了一些硬错误,因为A和B中的TRACK_THREAD_OWNER_FOR_DEBUG
不同,并且由于两个库中的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
静态变量的构造,该静态变量将根据受保护的条件调用库函数。因此,如果有一个翻译单元包含Foo.hpp
其中IMPORTANT_CONDITION
的定义与编译库中的定义不同,那么将出现缺少CONDITION_ON
或CONDITION_OFF
的链接器错误。CONDITION_ON
和CONDITION_OFF
函数名称应包含错误文本。
一种选择是将 A 的完整代码包含在项目 B 中。通过将 A 编译到静态库中,您想做什么?
我认为您最好的选择是根据目标生成不同的.a文件,即设置TRACK_THREAD_OWNER_FOR_DEBUG时为libA_debug.a,未设置时为libA.a。
然后,您可以根据您正在编译调试版本还是发布版本来设置要将 B 链接到的库。
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 此代码是否违反一个定义规则
- 为什么我的代码在输出中增加了93天
- 我的简单if-else语句是如何无法访问的代码
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 为什么在这个代码结束循环中没有得到结束
- 在c代码之间共享数据的最佳方式
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值