一個C++引用庫的標頭檔案預編譯陷阱
阿新 • • 發佈:2021-03-25
#### 寫在前面
老胡最近在工作中,有個場景需要使用一個第三方庫,引用標頭檔案,連結庫,編譯執行,一切都很正常,但是接下來就遇到了一個很詭異的問題,呼叫該庫的中的一個物件方法為物件修改屬性的時候,會影響到物件的另外一個屬性,當時百思不得其解,直呼靈異事件。
但後面靜下心來細細看了一下程式碼和各種配置,發現了問題所在,現在把這個問題分享在這裡,希望大家在以後的工作中如果遇到了類似的情況知道應該如何處理。
#### 場景還原
##### 庫
當時引用的是一個第三方的靜態連結庫,場景非常簡單,在專案中包含標頭檔案,連結器指定路徑和靜態庫名稱,我們這裡新建工程來生成一個非常簡單的庫。
![](https://img2020.cnblogs.com/blog/699616/202103/699616-20210324230203548-1263679183.png)
其中,
```cpp
//LibObject.h
#pragma once
struct LibObject
{
int valueA{ 0 };
#ifdef AdditionalValue
int valueB{ 0 };
#endif
int valueC{ 0 };
void DoSomething();
};
//LibObject.cpp
#include "LibObject.h"
void LibObject::DoSomething()
{
valueA = 10;
#ifdef AdditionalValue
valueB = 10;
#endif
}
```
簡單至極,若預編譯變數定義了**AdditionalValue**則定義多一個valueB並且在方法中賦值。編譯庫的時候我們指定**AdditionalValue**。
##### 客戶端程式碼
![](https://img2020.cnblogs.com/blog/699616/202103/699616-20210324230222657-398081143.png)
```cpp
//main.cpp
#include "LibObject.h"
#