C 프로그램을 작성하지 않고 시스템에서 데이터 유형 (int, float, double,…)의 크기를 찾을 수 있습니까?


19

C 프로그램을 작성하지 않고 Linux 시스템에서 데이터 유형 (int, float, double, ...)의 크기를 찾을 수 있습니까?

C의 결과는 C ++의 경우와 같고 다른 Linux의 다른 프로그래밍 언어는 동일합니까?


4
궁금합니다. C 프로그램을 작성하지 않으려는 경우 C 데이터 유형이 다른 크기가 아닌 한 크기이면 어떤 차이가 있습니까?
David Cary

7
@DavidCary C 이외의 언어로 ABI를 호출합니다!
Kaz

답변:


18

원하는 데이터 유형의 정의를 알고 있으면 getconf대부분의 Unix 시스템에서 이러한 값을 찾을 수 있습니다 .

$ getconf CHAR_BIT
8

변수 목록은 디스크에있을 man limits.h뿐 아니라 맨 페이지 와 여기에 정의되어 man sysconf있습니다. 당신이 locate limits.h그것을 찾을 수 있습니다, 그것은 종종 여기에 있습니다 : /usr/include/linux/limits.h.


4
경고는 플랫폼의 공식 C 컴파일러에만 적용됩니다. 크기가 다른 대체 컴파일러 또는 공식 컴파일러의 대체 구성 (일반적으로 명령 행 옵션을 통해)이있을 수 있습니다.
질 'SO-정지 존재 악마'

@Gilles-이러한 변수를 실제로 나열하는 방법을 본 적이 있습니까? 나는 찾고 있었고 내 인생에서 이것을 할 수있는 도구를 찾을 수 없습니다. 있을 것 같습니다. 또한이 값을 얻는 getconf것이 가장 안전한 방법 이라는 인상을 받고 있었습니다.
slm

3
C 프로그램을 컴파일하고 싶을 때 믿을 수있는 방법과 사람들이 돌볼 때 사용하는 방식은 작은 C 프로그램을 컴파일하는 것입니다. autoconf 작동 방식을 참조하십시오. getconfC 컴파일러를 옵션 으로 c89또는 c99거의 사용하지 않고 호출하지 않는 한 그렇게 안전하지 않습니다.
Gilles 'SO- 악마 그만두 다'

11

거의.

적어도 gcc를 사용하면 다음과 같이 작동합니다.

$ cpp -dD /dev/null | grep __SIZEOF_LONG__

어쨌든 C 프로그램을 작성하여 작성하고 싶지 않은 이유는 무엇입니까? 다음과 같이 쉘에서 작은 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에서 테스트되었습니다.


8

예. 스캔 할 수 있습니다/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 */

4
이것은 종종 작동하지만 때로는 다른 컴파일러 또는 컴파일러 설정으로 인해 크기가 다릅니다.
Gilles 'SO- 악의를 멈추십시오'

우분투에서 limits.h를 볼 때 -SHRT_MAX-와 같은 변수를 가리키고 그 값은 C 전 프로세서에 의해 파생됩니다. 어디서 찾을 수 있습니까?
Mr. Doomsbuster

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

6

아니 ... 이다 특히 64 비트 아키텍처에 대한 기본 유형의 크기, 다양한 아이디어와 바이너리를 실행할 수 있습니다. x86_64의 최신 Linux 커널은 기본 32 비트 바이너리를 실행할 수 있으며 32 비트 유형 의 x32 ABI 가 있습니다.

데이터 유형 크기는 부분적으로 컴파일러가 사용하는 것입니다. 그러나 (1) 기계가 효율적으로 지원하는 유형을 사용하고 (2) 사용자 응용 프로그램을 통해 저수준 라이브러리에서 일관되게 유형을 사용하는 것이 유리합니다. 여러 변형을 처리해야하는 것은 엉망입니다.


6

데이터 유형의 크기는 시스템이 아닌 컴파일러 (또는 ABI)의 속성입니다. 동일한 시스템에서 데이터 유형에 대해 서로 다른 크기를 사용하는 여러 컴파일러를 가질 수 있습니다.


0

데이터 유형을 참조하는 문자열이 포함 된 행을 구문 분석하고 출력하려면 다음을 시도하십시오.

{ 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하므로 때로는 값으로 더 많이 얻을 수 있지만 주로 and 명령으로 limits.h편리하게 볼 수있는 설정을 참조 합니다.getconf -aulimit -a

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.