CheckTypeSize
Этот модуль предоставляет команду для проверки размера типа или выражения C/C++.
Загрузите этот модуль в проект CMake с помощью:
include(CheckTypeSize)
Команды
Этот модуль предоставляет следующую команду:
-
check_type_size -
Однократно проверяет, существует ли тип или выражение C/C++, и определяет его размер:
check_type_size( <type> <size-var> [RESULT_VARIABLE <result-var>] [BUILTIN_TYPES_ONLY] [LANGUAGE <language>] )
Аргументы:
-
<type> -
Проверяемый тип или выражение.
-
<size-var> -
Имя внутренней переменной кэша для хранения размера типа или выражения
<type>. Это имя также используется в качестве префикса, как описано ниже. -
RESULT_VARIABLE <result-var> -
Добавлено в версии 4.2.
Имя внутренней переменной кэша, содержащей логическое значение, указывающее, существует ли тип или выражение
<type>. Если аргумент не задан, команда по умолчанию определит внутреннюю переменную кэша с именемHAVE_<size-var>. -
BUILTIN_TYPES_ONLY -
Если задан, при проверке поддерживаются только встроенные типы компилятора. Если аргумент не задан, команда проверяет наличие стандартных заголовочных файлов
<sys/types.h>,<stdint.h>и<stddef.h>и сохраняет результаты во внутренних переменных кэшаHAVE_SYS_TYPES_H,HAVE_STDINT_HиHAVE_STDDEF_H. Для типов C++std::также проверяются<cstdint>и<cstddef>, при этом соответственно определяютсяHAVE_CSTDINTиHAVE_CSTDDEF. Команда автоматически включает доступные заголовочные файлы в проверку размера типа, что позволяет проверять типы, определённые в этих заголовочных файлах. -
LANGUAGE <language> -
Для выполнения проверки использует компилятор
<language>. Допустимые значения:CиCXX. Если значение не указано, по умолчанию используетсяC.
Переменные результатов
Результаты сохраняются в следующих переменных:
-
<size-var> -
Внутренняя переменная кэша, содержащая одно из следующих значений:
-
<size> -
Если тип или выражение
<type>существует, переменная будет содержать ненулевой размер<size>в байтах. -
0 -
Если размер типа зависит от архитектуры. Это может произойти, когда в
CMAKE_OSX_ARCHITECTURESуказано несколько архитектур. В этом случае также определяется переменная<size-var>_KEYS, а переменная<size-var>_CODEсодержит сопоставление проверок препроцессора, как описано ниже. - "" (пустая строка)
-
Если тип или выражение
<type>не существует.
-
-
HAVE_<size-var> -
Внутренняя переменная кэша, содержащая логическое значение, указывающее, существует ли тип или выражение
<type>. Эта переменная определяется, если аргументRESULT_VARIABLEне используется. -
<result-var> -
Добавлено в версии 4.2.
Внутренняя переменная кэша, определяемая при использовании аргумента
RESULT_VARIABLE. Она содержит логическое значение, указывающее, существует ли тип или выражение<type>(то же значение, что иHAVE_<size-var>). В этом случае переменнаяHAVE_<size-var>не определяется. -
<size-var>_CODE -
Переменная CMake, содержащая код препроцессора для определения макроса
<size-var>равным размеру типа или для того, чтобы макрос остался неопределённым, если тип не существует.Если размер типа зависит от архитектуры (значение
<size-var>равно0), эта переменная содержит сопоставление проверок препроцессора: от макроса каждой архитектуры к соответствующему размеру типа. -
<size-var>_KEYS -
Переменная CMake, которая определяется только в том случае, если размер типа зависит от архитектуры (значение
<size-var>равно0), и содержит список макросов архитектур. Значение для каждого ключа хранится в переменных<size-var>-<key>.
Переменные, влияющие на проверку
Перед вызовом этой команды можно задать следующие переменные, чтобы изменить способ выполнения проверки:
-
CMAKE_REQUIRED_FLAGS -
Строка с дополнительными флагами, разделёнными пробелами, которые передаются компилятору. Список, разделённый точками с запятой, использовать нельзя. Содержимое
CMAKE_<LANG>_FLAGSи связанных с ним переменныхCMAKE_<LANG>_FLAGS_<CONFIG>, специфичных для конфигурации, автоматически добавляется в начало команды компилятора перед содержимым этой переменной.
-
CMAKE_REQUIRED_DEFINITIONS -
Список, разделённый точками с запятой, определений компилятора, каждое в форме
-DFOOили-DFOO=bar. Определение имени, указанного в аргументе переменной результата команды проверки, также добавляется автоматически.
-
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 SIZEOF_LONG_KEYS)
message("key: ${key}")
message("value: ${SIZEOF_LONG-${key}}")
endforeach()
message("SIZEOF_LONG_CODE:\n${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 SIZEOF_LONG 4 #elif defined(__x86_64) # define SIZEOF_LONG 8 #else # error SIZEOF_LONG unknown #endif
Пример: файл конфигурации
В следующем примере показано, как использовать переменные результатов в файле конфигурации:
include(CheckTypeSize) check_type_size(long SIZEOF_LONG) configure_file(config.h.in config.h @ONLY)
config.h.in/* Define whether the type 'long' exists. */ #cmakedefine HAVE_SIZEOF_LONG /* The size of 'long', as computed by sizeof. */ @SIZEOF_LONG_CODE@
Пример: проверка сложных выражений
Несмотря на название этого модуля, его также можно использовать для определения размера более сложных выражений. Например, для проверки размера члена структуры:
include(CheckTypeSize)
check_type_size("((struct something*)0)->member" SIZEOF_MEMBER)
Пример: изолированная проверка
В следующем примере проверка выполняется с временно изменённым набором дополнительных заголовочных файлов с использованием переменной CMAKE_EXTRA_INCLUDE_FILES и модуля CMakePushCheckState. Результат проверки сохраняется во внутренней переменной кэша HAVE_SIZEOF_UNION_SEMUN, а размер — во внутренней переменной кэша SIZEOF_UNION_SEMUN.
include(CheckTypeSize)
include(CMakePushCheckState)
cmake_push_check_state(RESET)
set(CMAKE_EXTRA_INCLUDE_FILES sys/types.h sys/ipc.h sys/sem.h)
check_type_size("union semun" SIZEOF_UNION_SEMUN)
cmake_pop_check_state()
Пример: настройка переменной результата
Начиная с CMake 4.2, имя переменной HAVE_<size-var> можно настроить с помощью аргумента RESULT_VARIABLE. В следующем примере этот модуль используется для проверки существования struct flock, а результат сохраняется во внутренней переменной кэша MyProj_HAVE_STRUCT_FLOCK:
cmake_minimum_required(VERSION 4.2)
# ...
include(CheckTypeSize)
include(CMakePushCheckState)
cmake_push_check_state(RESET)
set(CMAKE_EXTRA_INCLUDE_FILES "fcntl.h")
check_type_size(
"struct flock"
MyProj_SIZEOF_STRUCT_FLOCK
RESULT_VARIABLE MyProj_HAVE_STRUCT_FLOCK
)
cmake_pop_check_state()
© 2000–2026 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/latest/module/CheckTypeSize.html