1. 程式人生 > >一個C++引用庫的標頭檔案預編譯陷阱

一個C++引用庫的標頭檔案預編譯陷阱

#### 寫在前面 老胡最近在工作中,有個場景需要使用一個第三方庫,引用標頭檔案,連結庫,編譯執行,一切都很正常,但是接下來就遇到了一個很詭異的問題,呼叫該庫的中的一個物件方法為物件修改屬性的時候,會影響到物件的另外一個屬性,當時百思不得其解,直呼靈異事件。 但後面靜下心來細細看了一下程式碼和各種配置,發現了問題所在,現在把這個問題分享在這裡,希望大家在以後的工作中如果遇到了類似的情況知道應該如何處理。   #### 場景還原 ##### 庫 當時引用的是一個第三方的靜態連結庫,場景非常簡單,在專案中包含標頭檔案,連結器指定路徑和靜態庫名稱,我們這裡新建工程來生成一個非常簡單的庫。 ![](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" #