在C++中,#ifndef
是一個預處理指令,用于防止頭文件被多次包含。它的工作原理是檢查括號中的宏是否已經定義。如果沒有定義,則編譯頭文件的內容,并定義該宏。如果已經定義,則跳過頭文件的內容。
為了處理跨平臺編譯,你需要確保在所有平臺上使用相同的宏名稱。這可以通過以下方法實現:
-D
選項:g++ -DFOO myfile.cpp -o myfile
這將定義一個名為FOO
的宏。在你的C++代碼中,你可以使用#ifndef FOO
來檢查這個宏是否已經定義。
CMAKE_SYSTEM_NAME
變量來檢測當前的平臺,并根據平臺定義不同的宏。if (CMAKE_SYSTEM_NAME STREQUAL "Windows")
add_definitions(-DFOO_WIN)
elseif (CMAKE_SYSTEM_NAME STREQUAL "Linux")
add_definitions(-DFOO_LINUX)
elseif (CMAKE_SYSTEM_NAME STREQUAL "Darwin")
add_definitions(-DFOO_MAC)
endif()
這將分別為Windows、Linux和macOS平臺定義不同的宏(FOO_WIN
、FOO_LINUX
和FOO_MAC
)。在你的C++代碼中,你可以使用#ifndef FOO_WIN
(或相應的宏)來檢查當前平臺。
#ifdef _WIN32
#include <windows.h>
#elif defined(__linux__)
#include <unistd.h>
#elif defined(__APPLE__)
#include <unistd.h>
#endif
這將根據平臺包含不同的頭文件。請注意,這種方法可能不適用于所有情況,因為某些庫可能已經為你處理了跨平臺兼容性問題。