Чи можна дізнатися розміри типів даних (int, float, double, ...) в системі Linux, не записуючи програму C?
Чи будуть результати для C такими ж, як і для C ++, та інших мов програмування в тій же системі Linux?
Чи можна дізнатися розміри типів даних (int, float, double, ...) в системі Linux, не записуючи програму C?
Чи будуть результати для C такими ж, як і для C ++, та інших мов програмування в тій же системі Linux?
Відповіді:
Якщо ви знаєте визначення потрібного типу даних, ви можете використовувати getconf
ці значення в більшості систем Unix.
$ getconf CHAR_BIT
8
Список змінних визначається як на сторінці man, man limits.h
так і тут man sysconf
, на додаток до диска. Ви можете використовувати, locate limits.h
щоб знайти його, це часто тут : /usr/include/linux/limits.h
.
getconf
було найбезпечнішим способом, доки, як ви кажете, я натискаю на "офіційний компілятор".
getconf
не настільки безпечно, якщо ви не викликаєте компілятор C як c89
або c99
майже (без) жодної опції.
Типу.
Щонайменше з gcc, це працює:
$ cpp -dD /dev/null | grep __SIZEOF_LONG__
У будь-якому випадку, чому ви не хочете написати програму C, щоб це зробити? Ви можете відправити крихітну програму на ваш компілятор із оболонки приблизно так:
binary=$(mktemp)
cat <<\EOF | cc -o $binary -x c -
#include <stdio.h>
int main() {
printf("int=%lu bytes\n", sizeof(int));
printf("long=%lu bytes\n", sizeof(long));
}
EOF
$binary
rm $binary
Мова -x c
компілятора повідомляє мову C
, а -
засоби читають зі стандартного введення.
У моїй системі наведені вище відбитки:
int=4 bytes
long=8 bytes
Випробували в gcc та clang.
Так. Ви можете сканувати/usr/include/<arch>/limits.h
Наприклад, на моєму NetBSD amd64 /usr/include/amd64/limits.h
буде показано:
#define CHAR_BIT 8 /* number of bits in a char */
#define SCHAR_MAX 0x7f /* max value for a signed char */
#define SCHAR_MIN (-0x7f-1) /* min value for a signed char */
#define UCHAR_MAX 0xff /* max value for an unsigned char */
#define CHAR_MAX 0x7f /* max value for a char */
#define CHAR_MIN (-0x7f-1) /* min value for a char */
#define USHRT_MAX 0xffff /* max value for an unsigned short */
#define SHRT_MAX 0x7fff /* max value for a short */
#define SHRT_MIN (-0x7fff-1) /* min value for a short */
#define UINT_MAX 0xffffffffU /* max value for an unsigned int */
#define INT_MAX 0x7fffffff /* max value for an int */
#define INT_MIN (-0x7fffffff-1) /* min value for an int */
#define ULONG_MAX 0xffffffffffffffffUL /* max value for an unsigned long */
#define LONG_MAX 0x7fffffffffffffffL /* max value for a long */
#define LONG_MIN (-0x7fffffffffffffffL-1) /* min value for a long */
Якщо у вас встановлено Perl, ви можете отримати це від perl -V:
intsize=4, longsize=8, ptrsize=8, doublesize=8, byteorder=12345678
d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=16
ivtype='long', ivsize=8, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=8
alignbytes=8, prototype=define
Ні ... це можна запускати виконувані файли з різними ідеями розмірів основних типів, в зокрема , на 64 - бітних архітектур. Останні ядра Linux на x86_64 можуть запускати власні 32-бітні бінарні файли, а є X32 ABI з 32-ти бітовими типами.
Розміри типів даних частково використовуються компілятором. Але очевидно вигідно (1) використовувати типи, які машина ефективно підтримує, і (2) використовувати типи послідовно з бібліотек низького рівня через користувацькі програми. Доводиться обробляти кілька варіантів - це просто безлад.
Спробуйте це проаналізувати та вивести рядки, що містять рядки, що посилаються на типи даних:
{ shopt -s globstar; for i in /usr/include/**/*.h; do grep -HE '\b(([UL])|(UL)|())LONG|\bFLOAT|\bDOUBLE|\bINT' $i; done; }
Це, звичайно, вловлює визначення, /usr/include/limits.h
так що ви отримаєте той плюс більше, іноді зі значеннями, але в основному посилаючись на те, що встановлено, в limits.h
якому ви можете зручно подивитися за допомогою команд getconf -a
та ulimit -a
.