Tôi gặp lỗi
‘CHAR_WIDTH’ undeclared
khi tôi cố gắng biên dịch chương trình đơn giản này:
#include <stdio.h>
#include <limits.h>
int main()
{
printf("CHAR_BIT = %d\n", CHAR_BIT);
printf("CHAR_WIDTH = %d\n", CHAR_WIDTH);
return (0);
}
với
gcc ./show_char_width.c -o show_char_width
và gcc: GNU C17 (Ubuntu 8.3.0-6ubfox1) phiên bản 8.3.0 (x86_64-linux-gnu) được biên dịch bởi GNU C phiên bản 8.3.0, phiên bản GMP 6.1.2, phiên bản MPFR 4.0.2, MPC phiên bản 1.1.0 , phiên bản isl isl-0.20-GMP, kernel: 5.0.0-37-generic.
Như đã nêu ở đây CHAR_WIDTH nên được xác định trong giới hạn.h được bao gồm trong chương trình của tôi. Vậy tại sao tôi nhận được lỗi này?
Với -v
tùy chọn tôi thấy rằng thư viện sẽ được tìm kiếm trong các thư mục đó:
#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 chứa một giới hạn.h bao gồm syslimits.h từ cùng một thư mục bao gồm các giới hạn tiếp theo.h, theo cách hiểu của tôi nên được đặt trong thư mục / usr / bao gồm.
Macro CHAR_WIDTH thực sự được xác định trong các tệp đó nhưng trong một số điều kiện vượt quá kiến thức thực tế của tôi.
Các điều kiện tôi tìm thấy cho đến bây giờ là:
/* 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
và:
#ifdef __STDC_WANT_IEC_60559_BFP_EXT__
/* TS 18661-1 widths of integer types. */
# undef CHAR_WIDTH
# define CHAR_WIDTH __SCHAR_WIDTH__
Đó là lý do tại sao tôi cần sự giúp đỡ của bạn.
Lưu ý: Tôi nhận được cùng một lỗi với tất cả các macro khác được mô tả trong A.5.1: SCHAR_WIDTH, INT_WIDTH, LONG_WIDTH, v.v.
__STDC_WANT_IEC_60559_BFP_EXT__
hoặc vượt qua nó bằng dòng lệnh
CHAR_BIT
phải là 8, nghĩa là CHAR_WIDTH
cũng phải là 8 trên các hệ thống POSIX.
#define
trước #include
?