CHAR_WIDTH 선언되지 않은


9

‘CHAR_WIDTH’ undeclared 이 간단한 프로그램을 컴파일하려고 할 때 오류가 발생 합니다.

#include <stdio.h>
#include <limits.h>

int main()
{
  printf("CHAR_BIT = %d\n", CHAR_BIT);
  printf("CHAR_WIDTH = %d\n", CHAR_WIDTH);
  return (0);
}

gcc ./show_char_width.c -o show_char_width

및 gcc : GNU C 버전 8.3.0, GMP 버전 6.1.2, MPFR 버전 4.0.2, MPC 버전 1.1.0으로 컴파일 된 GNU C17 (Ubuntu 8.3.0-6ubuntu1) 버전 8.3.0 (x86_64-linux-gnu) , isl 버전 isl-0.20-GMP, 커널 : 5.0.0-37-generic.

여기에 명시된 바와 같이 CHAR_WIDTH는 내 프로그램에 포함 된 limits.h에 정의되어야합니다. 왜이 오류가 발생합니까?

으로 -v옵션 나는 라이브러리가 해당 디렉토리에서 검색됩니다 발견 :

#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc/x86_64-linux-gnu/8/include
 /usr/local/include
 /usr/lib/gcc/x86_64-linux-gnu/8/include-fixed
 /usr/include/x86_64-linux-gnu
 /usr/include

/ usr / lib / gcc / x86_64-linux-gnu / 8 / include-fixed에는 같은 디렉토리의 syslimits.h를 포함하는 limits.h가 포함되어 있습니다.이 디렉토리에는 다음 limit.h가 포함되어 있습니다. / usr / include 디렉토리

CHAR_WIDTH 매크로는 실제로 해당 파일에 정의되어 있지만 실제 조건을 초과하는 일부 조건에서는 정의되어 있습니다.

지금까지 내가 찾은 조건은 다음과 같습니다.


/* The integer width macros are not defined by GCC's <limits.h> before
   GCC 7, or if _GNU_SOURCE rather than
   __STDC_WANT_IEC_60559_BFP_EXT__ is used to enable this feature.  */
#if __GLIBC_USE (IEC_60559_BFP_EXT)
# ifndef CHAR_WIDTH
#  define CHAR_WIDTH 8
# endif

그리고 :

#ifdef __STDC_WANT_IEC_60559_BFP_EXT__
/* TS 18661-1 widths of integer types.  */
# undef CHAR_WIDTH
# define CHAR_WIDTH __SCHAR_WIDTH__

그래서 나는 당신의 도움이 필요합니다.

참고 : A.5.1에 ​​설명 된 다른 모든 매크로 (SCHAR_WIDTH, INT_WIDTH, LONG_WIDTH 등)에서 동일한 오류가 발생합니다.


어떤 조건입니까?
LPs

1
@LP : 아마도 OP가 이해하지 못하는 것-> " 내 실제 지식을 초과합니다. "
alk

2
편집 후. __STDC_WANT_IEC_60559_BFP_EXT__명령 행으로 정의 또는 전달
LPs

1
다음으로 POSIX는 CHAR_BIT8이어야하며 이는 CHAR_WIDTHPOSIX 시스템에서도 8이어야합니다.
Andrew Henle

4
@pliski #define전에 #include했습니까?
LegendofPedro

답변:


5

CHAR_WIDTH표준이 아니며 다른 *_WIDTH매크로도 아니지만 문자 유형의 너비는 CHAR_BIT어쨌든 * 와 같아야합니다 .

일반적으로 *_WIDTH매크로는 해당 부호없는 유형의 최대 값에서 컴파일 타임 계산 가능하므로 엄격하게 필요하지 않습니다. 즉, #define WIDTH_FROM_UNSIGNED_MAX(UnsignedMax)전 처리기 조건부에서도 사용할 수있는 정수 상수 표현식으로 확장 할 수 있습니다 ( #if), 구현이 약간 모호하지만 ( 컴파일 타임에 정수 유형의 너비를 계산하는 방법이 있습니까? )

#define WIDTH_FROM_UNSIGNED_MAX(UnsignedMax) POW2_MINUS1_BITS_2039(UnsignedMax)
/* Number of bits in inttype_MAX, or in any (1<<k)-1 where 0 <= k < 2040 */
#define POW2_MINUS1_BITS_2039(X) ((X)/((X)%255+1) / 255%255*8 + 7-86/((X)%255+12))

//compile-time test it, assuming uint{8,16,32,64}_t exist
#include <inttypes.h>
#if WIDTH_FROM_UNSIGNED_MAX(UINT8_MAX) != 8
    #error
#endif
#if WIDTH_FROM_UNSIGNED_MAX(UINT16_MAX) != 16
    #error
#endif
#if WIDTH_FROM_UNSIGNED_MAX(UINT32_MAX) != 32
    #error
#endif
#if WIDTH_FROM_UNSIGNED_MAX(UINT64_MAX) != 64
    #error
#endif

일부 사람들 은 패딩 비트가 없으며 (일반적으로 이론적으로는 가질 수 없지만) 조건부 에서 사용할 수 없다고 가정하기 때문에 CHAR_BIT * sizeof(integer_type)엄격하게 이식integer_type 할 수는 없습니다 #if.


* 불행히도,이 정보를 수집하려면 표준을 뛰어 넘어야합니다.

정수 유형의 너비는 패딩되지 않은 비트 수 ( 6.2.6.2p6 ) 로 (약간 간접적으로) 정의됩니다 .

6.2.6.2p2signed char패딩 비트가 없다고 말합니다 . 이 때문에, 정수 C (표현 될 수있는 방법 6.2.6.2p2 의미) unsigned char중 임의의 패딩 비트를 가질 수없고, 사람 char등의 어느 하나와 동일한 범위 있어야 signed char하거나 unsigned char( 5.2.4.2.1p2 ) 동일하면서 sizeof값 ( 즉, 1, 6.5.3.4p4 ), 일반 char은 패딩 비트를 가질 수 없으므로 CHAR_BIT == 너비 ( char| signed char| unsigned char) 입니다.

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