Bir C programına yazmadan bir Linux sistemindeki veri türlerinin boyutlarını (int, float, double, ...) bulmak mümkün müdür?
C sonuçları C ++ ile aynı programlama sistemindeki diğer programlama dilleriyle aynı mıdır?
Bir C programına yazmadan bir Linux sistemindeki veri türlerinin boyutlarını (int, float, double, ...) bulmak mümkün müdür?
C sonuçları C ++ ile aynı programlama sistemindeki diğer programlama dilleriyle aynı mıdır?
Yanıtlar:
İstediğiniz veri türünün tanımını biliyorsanız, getconf
bu değerleri çoğu Unix sisteminde bulmak için kullanabilirsiniz .
$ getconf CHAR_BIT
8
Değişkenlerin listesi , diskte olmanın man limits.h
yanı sıra , man sayfasında da burada tanımlanır man sysconf
. Sen kullanabilirsiniz locate limits.h
burada sık sık var, onu bulmak için: /usr/include/linux/limits.h
.
getconf
etmenin en güvenli yol olduğu izlenimi altındaydım, söylediğiniz sürece, kutudaki resmi derleyiciyi vuruyorum.
getconf
C derleyicisini (neredeyse) seçeneksiz olarak c89
veya çağırmıyorsanız o kadar güvenli değil c99
.
Türü.
En azından gcc ile bu işe yarar:
$ cpp -dD /dev/null | grep __SIZEOF_LONG__
Neyse, neden bunu yapmak için bir C programı yazmak istemiyorsun? Kabuğunuzdan derleyicinize küçük bir C programı aşağıdaki gibi bir şey gönderebilirsiniz:
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
Dildir derleyici söyler C
ve -
standart girdiden okunan araçları.
Sistemimde, yukarıdaki baskılar:
int=4 bytes
long=8 bytes
Gcc ve clang'da test edilmiştir.
Evet. Tarayabilirsin/usr/include/<arch>/limits.h
Örneğin, NetBSD amd64'ümde şunlar /usr/include/amd64/limits.h
gösterilir:
#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 */
Perl yüklüyse bunu perl -V'den alabilirsiniz:
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
Hayır ... olduğunu özellikle 64 bit mimarileri üzerinde temel tiplerinin boyutları farklı fikirlerle ikilileri çalıştırmak mümkün. X86_64'teki en son Linux çekirdekleri yerel 32 bit ikili dosyaları çalıştırabilir ve 32 bit tipli x32 ABI vardır.
Veri türü boyutları, derleyicinin kullandığı boyuttur. Ancak, makinenin verimli bir şekilde desteklediği (1) tiplerin kullanılması ve (2) düşük seviyeli kütüphanelerden kullanıcı uygulamalarına kadar sürekli olarak tiplerin kullanılması avantajlıdır. Birkaç varyantı işlemek sadece bir karışıklıktır.
Veri türlerine referans veren dizeleri içeren satırları ayrıştırmak ve çıktı almak için bunu deneyin:
{ shopt -s globstar; for i in /usr/include/**/*.h; do grep -HE '\b(([UL])|(UL)|())LONG|\bFLOAT|\bDOUBLE|\bINT' $i; done; }
Bu elbette tanımları yakalar, /usr/include/limits.h
böylece bazen artı değerlerle artı daha fazlasını elde edersiniz, ancak çoğunlukla ve komutlarıyla limits.h
rahatça bakabileceğiniz şeyleri referans alır .getconf -a
ulimit -a