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

要传递给编译器的其他标志的字符串。该字符串必须是空格分隔的——;-列表 将不起作用。CMAKE_<LANG>_FLAGS 及其相关的配置特定变量的内容会自动添加到编译器命令中,在 CMAKE_REQUIRED_FLAGS 的内容之前。

CMAKE_REQUIRED_DEFINITIONS

一个 ;-列表 的编译器定义,形式为 -DFOO-DFOO=bar。还将自动添加由 <resultVar> 指定的名称的定义。

CMAKE_REQUIRED_INCLUDES

一个 ;-列表 的头文件搜索路径,用于传递给编译器。这些将是唯一使用的头文件搜索路径——INCLUDE_DIRECTORIES 目录属性的内容将被忽略。

CMAKE_REQUIRED_LINK_OPTIONS

在 3.14 版本中添加。

一个 ;-列表 的选项,添加到链接命令(请参阅 try_compile() 以获取更多详细信息)。

CMAKE_REQUIRED_LIBRARIES

一个 ;-列表 的库,添加到链接命令。这些可以是系统库的名称,也可以是 导入的目标 (请参阅 try_compile() 以获取更多详细信息)。

CMAKE_REQUIRED_LINK_DIRECTORIES

在 3.31 版本中添加。

一个 ;-列表 的库搜索路径,用于传递给链接器(请参阅 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