কোনও সিস্টেমে কোনও সি প্রোগ্রাম না লিখে ডাটা টাইপের আকার (ইনট, ফ্লোট, ডাবল,…) সন্ধান করা সম্ভব?


19

কোনও লিনাক্স সিস্টেমে কোনও সি প্রোগ্রাম না লিখে তথ্য প্রকারের (ইন্ট, ফ্লোট, ডাবল, ...) সন্ধান করা সম্ভব?

সি জন্য ফলাফল একই সি ++ এবং একই লিনাক্স সিস্টেমের অন্যান্য প্রোগ্রামিং ভাষার জন্য?


4
আমি কৌতূহলী - আপনি যদি কোনও সি প্রোগ্রাম লেখার ইচ্ছা না রাখেন, সি ডাটা টাইপগুলি অন্যের চেয়ে এক আকারের হয় তবে তাতে কী পার্থক্য হবে?
ডেভিড ক্যারি

7
@ ডেভিডকারি সিবি ব্যতীত অন্য কোনও ভাষা থেকে এবিআইয়ের কল করার জন্য!
কাজ

উত্তর:


18

আপনি যদি ডেটা টাইপের সংজ্ঞাটি জানেন তবে আপনি চান যে আপনি getconfবেশিরভাগ ইউনিক্স সিস্টেমে এই মানগুলি খুঁজে পেতে পারেন ।

$ getconf CHAR_BIT
8

ভেরিয়েবলের তালিকাটি ডিস্কে থাকা ছাড়াও ম্যান পৃষ্ঠাতেও man limits.hএখানে সংজ্ঞায়িত করা হয় man sysconf। আপনি ব্যবহার করতে পারেন locate limits.hএটা প্রায়ই এখানে, এটি দেখুন: /usr/include/linux/limits.h


4
এই কেবলমাত্র প্ল্যাটফর্মের অফিসিয়াল সি সংকলকের ক্ষেত্রে প্রযোজ্য সেই সাবধানতার সাথে। অফিসিয়াল কম্পাইলারের বিকল্প সংকলক বা বিকল্প কনফিগারেশন (সাধারণত কমান্ড লাইন বিকল্পের মাধ্যমে) থাকতে পারে যা বিভিন্ন আকারের হতে পারে।
গিলস 'অশুভ হওয়া বন্ধ করুন'

@ গিলস - আপনি কি কখনও এই ভেরিয়েবলগুলি তালিকাভুক্ত করার উপায় দেখেছেন? আমি আমার জীবনের সন্ধান করছি এবং করতে পারি না এমন একটি সরঞ্জাম পেয়েছে যা এটি করতে পারে। মনে হবে সেখানে হবে। এছাড়াও আমি এই ধারণাটির মধ্যে getconfছিলাম যে এই মানগুলি পাওয়া সবচেয়ে নিরাপদতম উপায়, আপনি যতক্ষণ বলছেন, আমি বাক্সে "অফিসিয়াল সংকলক" টিপছি।
slm

3
নির্ভরযোগ্য উপায় - এবং লোকেরা তাদের যত্ন নেওয়ার সময় যেভাবে ব্যবহার করে, যা কোনও সি প্রোগ্রাম সংকলন করতে চাইলে হয় এবং বৃহত্তর - একটি ছোট সি প্রোগ্রাম সংকলন করে। অটোকনফ কীভাবে পরিচালনা করে দেখুন। getconfআপনি এতটা নিরাপদ নন, যদি না আপনি সি সংকলককে কল করেন c89বা না c99(প্রায়) কোনও বিকল্প নেই।
গিলস 'অশুভ হওয়া বন্ধ করুন'

11

ধরনের।

কমপক্ষে জিসিসি সহ, এটি কাজ করে:

$ cpp -dD /dev/null | grep __SIZEOF_LONG__

যাইহোক, আপনি এটি করতে কোনও সি প্রোগ্রাম লিখতে চান না কেন? আপনি শেল থেকে আপনার সংকলকটিতে একটি ছোট্ট সি প্রোগ্রাম পাঠাতে পারেন something

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

জিসিসি এবং বিড়ম্বনায় পরীক্ষিত।


8

হ্যাঁ. আপনি স্ক্যান করতে পারে/usr/include/<arch>/limits.h

উদাহরণস্বরূপ, আমার নেটবিএসডি এএমডি 64 এ প্রদর্শিত /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
এটি প্রায়শই কাজ করে তবে কখনও কখনও বিভিন্ন সংকলক বা সংকলক সেটিংস বিভিন্ন আকারের দিকে নিয়ে যায়।
গিলস 'অশুভ হওয়া বন্ধ করুন'

যখন আমি উবুন্টুতে সীমাবদ্ধতাগুলি দেখি তখন এটি -SHRT_MAX- এর মতো ভেরিয়েবলগুলিতে পয়েন্ট করে, যার মান সি প্রি-প্রসেসর দ্বারা প্রাপ্ত। আমি কোথায় এটি পেতে পারি?
মিঃ ডুমসবাস্টার 20

8

আপনি যদি পার্ল ইনস্টল করে থাকেন তবে পার্ল-ভি থেকে এটি পেতে পারেন:

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- র সাম্প্রতিক লিনাক্স কার্নেলগুলি 32 বিট বাইনারিগুলি চালাতে পারে এবং সেখানে 32 বিট ধরণের x32 ABI রয়েছে।

তথ্য প্রকারের আকারগুলি সংকলকটি ব্যবহার করে যা আংশিক। তবে (1) প্রকারের মেশিনটি দক্ষতার সাথে সমর্থন করে এবং (2) ব্যবহারকারী অ্যাপ্লিকেশনগুলির মাধ্যমে নিম্ন স্তরের গ্রন্থাগারগুলি থেকে ধারাবাহিকভাবে প্রকারগুলি ব্যবহার করা স্পষ্টভাবে সুবিধাজনক। বেশ কয়েকটি বৈকল্পিক হ্যান্ডেল করা কেবল একটি গোলযোগ।


6

আকারের ডাটা টাইপগুলি কোনও সংকলক (বা এবিআই) এর সম্পত্তি, সিস্টেম নয়। আপনার একই সিস্টেমে ডেটা ধরণের জন্য বিভিন্ন আকারের ব্যবহার করে একাধিক সংকলক থাকতে পারে।


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যাতে আপনি এটি আরও বেশি পেতে পারেন, কখনও কখনও মান সহ, তবে বেশিরভাগ ক্ষেত্রে কী সেট করা হয় তা উল্লেখ করে limits.hআপনি সুবিধামতভাবে আদেশ getconf -aএবং ulimit -aকমান্ড দিয়ে দেখতে পারেন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.