CheckTypeSize

檢查類型的大小

check_type_size
check_type_size(<type> <variable> [BUILTIN_TYPES_ONLY]
                                  [LANGUAGE <language>])

檢查類型是否存在並確定其大小。結果將在以下變數中報告

HAVE_<variable>

保存一個真值或假值,指示類型是否存在。

<variable>

保存以下值之一

<size>

類型具有非零大小 <size>

0

類型具有架構相依的大小。當 CMAKE_OSX_ARCHITECTURES 具有多個架構時,可能會發生這種情況。在這種情況下,<variable>_CODE 包含 C 預處理器測試,將每個架構巨集對應到相應的類型大小。架構巨集的列表儲存在 <variable>_KEYS 中,而每個鍵的值都儲存在 <variable>-<key> 中。

"" (空字串)

類型不存在。

<variable>_CODE

保存 C 預處理器程式碼,以將巨集 <variable> 定義為類型的大小,如果類型不存在,則保持巨集未定義。

選項如下

BUILTIN_TYPES_ONLY

僅支援編譯器內建類型。如果給定,則巨集會檢查標頭 <sys/types.h><stdint.h><stddef.h>,並將結果儲存在 HAVE_SYS_TYPES_HHAVE_STDINT_HHAVE_STDDEF_H 中。類型大小檢查會自動包含可用的標頭,因此支援檢查標頭中定義的類型。

LANGUAGE <language>

使用 <language> 編譯器執行檢查。可接受的值為 CCXX。如果未指定,則預設為 C

儘管巨集名稱如此,您也可以使用它來檢查更複雜的表達式的大小。例如,要檢查結構成員的大小,您可以執行類似以下的操作

check_type_size("((struct something*)0)->member" SIZEOF_MEMBER)

以下變數可以在呼叫此巨集之前設定,以修改檢查的執行方式

CMAKE_REQUIRED_FLAGS

要傳遞給編譯器的額外旗標字串。該字串必須以空格分隔——;-list 將不起作用。CMAKE_<LANG>_FLAGS 及其相關的組態特定變數的內容,會在 CMAKE_REQUIRED_FLAGS 的內容之前自動新增到編譯器命令中。

CMAKE_REQUIRED_DEFINITIONS

形式為 -DFOO-DFOO=bar 的編譯器定義的 ;-list。也將自動新增由 <resultVar> 指定的名稱的定義。

CMAKE_REQUIRED_INCLUDES

要傳遞給編譯器的標頭搜尋路徑的 ;-list。這些將是唯一使用的標頭搜尋路徑——INCLUDE_DIRECTORIES 目錄屬性的內容將被忽略。

CMAKE_REQUIRED_LINK_OPTIONS

在版本 3.14 中新增。

要新增到連結命令的選項的 ;-list (請參閱 try_compile() 以取得更多詳細資訊)。

CMAKE_REQUIRED_LIBRARIES

要新增到連結命令的程式庫的 ;-list。這些可以是系統程式庫的名稱,也可以是 匯入目標 (請參閱 try_compile() 以取得更多詳細資訊)。

CMAKE_REQUIRED_LINK_DIRECTORIES

在版本 3.31 中新增。

要傳遞給連結器的程式庫搜尋路徑的 ;-list (請參閱 try_compile() 以取得更多詳細資訊)。

CMAKE_REQUIRED_QUIET

在版本 3.1 中新增。

如果此變數評估為布林真值,則所有與檢查相關聯的狀態訊息都將被抑制。

CMAKE_EXTRA_INCLUDE_FILES

要包含的額外標頭列表。

範例

考慮以下程式碼

include(CheckTypeSize)

# Check for size of long.
check_type_size(long SIZEOF_LONG)
message("HAVE_SIZEOF_LONG: ${HAVE_SIZEOF_LONG}")
message("SIZEOF_LONG: ${SIZEOF_LONG}")
message("SIZEOF_LONG_CODE: ${SIZEOF_LONG_CODE}")

在 64 位元架構上,輸出可能看起來像這樣

HAVE_SIZEOF_LONG: TRUE
SIZEOF_LONG: 8
SIZEOF_LONG_CODE: #define SIZEOF_LONG 8

在 Apple 平台上,當 CMAKE_OSX_ARCHITECTURES 具有多個架構時,類型可能具有架構相依的大小。例如,使用以下程式碼

include(CheckTypeSize)

check_type_size(long SIZEOF_LONG)
message("HAVE_SIZEOF_LONG: ${HAVE_SIZEOF_LONG}")
message("SIZEOF_LONG: ${SIZEOF_LONG}")
foreach(key IN LISTS SIZE_OF_LONG_KEYS)
  message("key: ${key}")
  message("value: ${SIZE_OF_LONG-${key}}")
endforeach()
message("SIZEOF_LONG_CODE:
${SIZEOF_LONG_CODE}")

結果可能是

HAVE_SIZEOF_LONG: TRUE
SIZEOF_LONG: 0
key: __i386
value: 4
key: __x86_64
value: 8
SIZEOF_LONG_CODE:
#if defined(__i386)
# define SIZE_OF_LONG 4
#elif defined(__x86_64)
# define SIZE_OF_LONG 8
#else
# error SIZE_OF_LONG unknown
#endif