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_H
、HAVE_STDINT_H
和HAVE_STDDEF_H
中。类型大小检查自动包含可用的头文件,从而支持检查头文件中定义的类型。LANGUAGE <language>
使用
<language>
编译器执行检查。可接受的值为C
和CXX
。如果未指定,则默认为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