কোনও লিনাক্স সিস্টেমে কোনও সি প্রোগ্রাম না লিখে তথ্য প্রকারের (ইন্ট, ফ্লোট, ডাবল, ...) সন্ধান করা সম্ভব?
সি জন্য ফলাফল একই সি ++ এবং একই লিনাক্স সিস্টেমের অন্যান্য প্রোগ্রামিং ভাষার জন্য?
কোনও লিনাক্স সিস্টেমে কোনও সি প্রোগ্রাম না লিখে তথ্য প্রকারের (ইন্ট, ফ্লোট, ডাবল, ...) সন্ধান করা সম্ভব?
সি জন্য ফলাফল একই সি ++ এবং একই লিনাক্স সিস্টেমের অন্যান্য প্রোগ্রামিং ভাষার জন্য?
উত্তর:
আপনি যদি ডেটা টাইপের সংজ্ঞাটি জানেন তবে আপনি চান যে আপনি getconf
বেশিরভাগ ইউনিক্স সিস্টেমে এই মানগুলি খুঁজে পেতে পারেন ।
$ getconf CHAR_BIT
8
ভেরিয়েবলের তালিকাটি ডিস্কে থাকা ছাড়াও ম্যান পৃষ্ঠাতেও man limits.h
এখানে সংজ্ঞায়িত করা হয় man sysconf
। আপনি ব্যবহার করতে পারেন locate limits.h
এটা প্রায়ই এখানে, এটি দেখুন: /usr/include/linux/limits.h
।
getconf
ছিলাম যে এই মানগুলি পাওয়া সবচেয়ে নিরাপদতম উপায়, আপনি যতক্ষণ বলছেন, আমি বাক্সে "অফিসিয়াল সংকলক" টিপছি।
getconf
আপনি এতটা নিরাপদ নন, যদি না আপনি সি সংকলককে কল করেন c89
বা না c99
(প্রায়) কোনও বিকল্প নেই।
ধরনের।
কমপক্ষে জিসিসি সহ, এটি কাজ করে:
$ 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
জিসিসি এবং বিড়ম্বনায় পরীক্ষিত।
হ্যাঁ. আপনি স্ক্যান করতে পারে/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 */
আপনি যদি পার্ল ইনস্টল করে থাকেন তবে পার্ল-ভি থেকে এটি পেতে পারেন:
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
কোন ... এটা হল মৌলিক ধরনের মাপ, বিশেষ করে 64 বিট আর্কিটেকচারের উপর বিভিন্ন ধারনা সঙ্গে বাইনেরিতে চালানো সম্ভব। X86_64- র সাম্প্রতিক লিনাক্স কার্নেলগুলি 32 বিট বাইনারিগুলি চালাতে পারে এবং সেখানে 32 বিট ধরণের x32 ABI রয়েছে।
তথ্য প্রকারের আকারগুলি সংকলকটি ব্যবহার করে যা আংশিক। তবে (1) প্রকারের মেশিনটি দক্ষতার সাথে সমর্থন করে এবং (2) ব্যবহারকারী অ্যাপ্লিকেশনগুলির মাধ্যমে নিম্ন স্তরের গ্রন্থাগারগুলি থেকে ধারাবাহিকভাবে প্রকারগুলি ব্যবহার করা স্পষ্টভাবে সুবিধাজনক। বেশ কয়েকটি বৈকল্পিক হ্যান্ডেল করা কেবল একটি গোলযোগ।
ডাটা টাইপের উল্লেখ করে স্ট্রিংগুলি যুক্ত লাইনগুলি বিশ্লেষণ এবং আউটপুট করার চেষ্টা করুন:
{ 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
কমান্ড দিয়ে দেখতে পারেন ।