可以在不编写 C 程序的情况下找出系统上数据类型(int、float、double 等)的大小吗?

Tim*_*Tim 26 c

是否可以在不编写 C 程序的情况下在 Linux 系统上找出数据类型(int、float、double 等)的大小?

在同一 Linux 系统中,C 和 C++ 以及其他编程语言的结果是否相同?

slm*_*slm 23

如果你知道你想要的数据类型的定义,你可以用来getconf在大多数 Unix 系统上找到这些值。

$ getconf CHAR_BIT
8
Run Code Online (Sandbox Code Playgroud)

除了在磁盘上之外,变量列表还在手册页man limits.h以及此处定义man sysconf。你可以用locate limits.h它来找到它,它通常在这里:/usr/include/linux/limits.h

  • 可靠的方法——以及人们在关心时使用的方法,基本上是他们想要编译 C 程序时使用的方法——是编译一个小的 C 程序。看看 autoconf 如何运作。`getconf` 不是那么安全,除非您将 C 编译器称为 `c89` 或 `c99`,并且(几乎)没有选项。 (5认同)
  • 需要注意的是,这仅适用于平台的官方 C 编译器。可能有官方编译器的替代编译器或替代配置(通常通过命令行选项),导致不同的大小。 (4认同)

Mik*_*kel 13

的种类。

至少使用 gcc,这是有效的:

$ cpp -dD /dev/null | grep __SIZEOF_LONG__
Run Code Online (Sandbox Code Playgroud)

不管怎样,你为什么不想写一个 C 程序来做这件事呢?您可以从 shell 向编译器发送一个小型 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
Run Code Online (Sandbox Code Playgroud)

-x c告诉编译器的语言C,并-从标准输入读取手段。

在我的系统上,上面打印:

int=4 bytes
long=8 bytes
Run Code Online (Sandbox Code Playgroud)

在 gcc 和 clang 中测试。


dev*_*ull 9

是的。你可以扫描/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 */
Run Code Online (Sandbox Code Playgroud)

  • 这通常有效,但有时不同的编译器或编译器设置会导致不同的大小。 (4认同)

小智 8

如果你安装了 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
Run Code Online (Sandbox Code Playgroud)


小智 8

数据类型的大小是编译器(或 ABI)的属性,而不是系统的属性。您可以让多个编译器在同一系统上使用不同大小的数据类型。


von*_*and 7

不...应该可以运行基本类型的大小,特别是在64位架构的不同想法的二进制文件。x86_64 上的最新 Linux 内核可以运行本机 32 位二进制文​​件,并且有具有 32 位类型的x32 ABI

数据类型大小部分是编译器使用的。但是,(1) 使用机器有效支持的类型和 (2) 从低级库到用户应用程序一致地使用类型显然是有利的。必须处理多个变体只是一团糟。