Я отримую помилку,
‘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 C17 (Ubuntu 8.3.0-6ubuntu1) версія 8.3.0 (x86_64-linux-gnu), складений GNU C версії 8.3.0, GMP версії 6.1.2, MPFR версії 4.0.2, MPC версії 1.1.0 , версія isl isl-0.20-GMP, ядро: 5.0.0-37-generic.
Як зазначено тут, CHAR_WIDTH слід визначати в межах limit.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-fix містять обмеження.h, які включають syslimits.h з того самого dir, що, в свою чергу, включає наступні 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 тощо.
__STDC_WANT_IEC_60559_BFP_EXT__
або передайте його командним рядком
CHAR_BIT
має бути 8, а це означає, що CHAR_WIDTH
також повинно бути 8 у системах POSIX.
#define
раніше #include
?