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

এবং জিসিসি: জিএনইউ সি 17 (উবুন্টু 8.3.0-6ubuntu1) সংস্করণ 8.3.0 (x86_64-linux-gnu) GNU সি সংস্করণ 8.3.0, GMP সংস্করণ 6.1.2, MPFR সংস্করণ 4.0.2, MPC সংস্করণ 1.1.0 দ্বারা সংকলিত , isl সংস্করণ isl-0.20-GMP, কার্নেল: 5.0.0-37-জেনেরিক।

এখানে যেমন বলা হয়েছে CHAR_WIDTH সীমাবদ্ধতার মধ্যে সংজ্ঞায়িত করা উচিত যা আমার প্রোগ্রামের অন্তর্ভুক্ত। তাহলে আমি কেন এই ত্রুটি পাই?

সঙ্গে -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 / অন্তর্ভুক্ত-নির্দিষ্ট একটি সীমা রয়েছে যা একই dir থেকে syslimits.h অন্তর্ভুক্ত করে যার ফলে পরের সীমাগুলি অন্তর্ভুক্ত হয়।, যে আমার বোধ থেকে অবস্থিত হওয়া উচিত / usr / অন্তর্ভুক্ত ডিরেক্টরি।

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, ইত্যাদি


কোন ধরণের অবস্থা?
এলপিগুলি

1
@LP: সম্ভবত কিছু যে ওপি বোঝে না -> " আমার প্রকৃত জ্ঞান অতিক্রম। "
ALK

2
সম্পাদনার পরে। __STDC_WANT_IEC_60559_BFP_EXT__কমান্ড লাইনের মাধ্যমে এটি সংজ্ঞায়িত বা পাস করুন
এলপিএস

1
এফডাব্লুআইডাব্লু, পসিক্সের CHAR_BIT8 হওয়া দরকার , যার অর্থ CHAR_WIDTHপসিক্স সিস্টেমে 8 টি হওয়া উচিত।
অ্যান্ড্রু হেনেল

4
@ প্লিসকি আপনি #defineআগে কি করেছিলেন #include?
লেজেন্ডোফপেডো

উত্তর:


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 )।

.2.২. ..২p2 বলছে signed charকোনও প্যাডিং বিট নেই। সি ( .2.২.২.২p2 ) তে পূর্ণসংখ্যার প্রতিনিধিত্ব করার কারণে, এর দ্বারা বোঝা যায় যে 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.