Skip to content

Γ. Λήψη πληροφοριών για το σύστημα και το μεταγλωττιστή

Το ακόλουθο πρόγραμμα (κώδικας Γ.1) ανιχνεύει τον τύπο του μεταγλωττιστή της C, εμφανίζοντας την έκδοσή του σε περίπτωση που είναι ένας από τους GCC, Clang ή MSVC (Microsoft Visual C++ Compiler). Επιπλέον, εμφανίζει αν το σύστημα έχει αρχιτεκτονική 16, 32 ή 64 bits και τα μεγέθη που καταλαμβάνουν στη μνήμη μεταβλητές διάφορων τύπων καθώς και το εύρος τιμών που μπορούν να «φιλοξενήσουν».

Κώδικας Γ.1: appendix3/types_sizes_widths.c - ανίχνευση έκδοσης μεταγλωττιστή, τύπου συστήματος και εύρους τύπων δεδομένων.
#include <float.h>
#include <limits.h>
#include <stdio.h>

int main(void) {
#if __clang__
  printf("clang %d.%d.%d detected\n", __clang_major__, __clang_minor__,
         __clang_patchlevel__);
#elif __GNUC__
  printf("GCC %d.%d.%d detected\n", __GNUC__, __GNUC_MINOR__,
         __GNUC_PATCHLEVEL__);
#elif defined(_MSC_VER)
  printf("MSVC Version=%d Full version=%d detected\n", _MSC_VER, _MSC_FULL_VER);
#endif
  printf("Platform: %d bits\n", (int)(CHAR_BIT * sizeof(void *)));
  printf("Data Type(Storage Size)\t    Value Range\n");
  printf("-------------------------------------------------------------\n");
  printf("char (%zu byte)\t\t    %d to %d\n", sizeof(char), CHAR_MIN, CHAR_MAX);
  printf("unsigned char (%zu byte)\t    0 to %u\n", sizeof(unsigned char),
         UCHAR_MAX);
  printf("signed char (%zu byte)\t    %d to %d\n", sizeof(signed char),
         SCHAR_MIN, SCHAR_MAX);
  printf("int (%zu bytes)\t\t    %d to %d\n", sizeof(int), INT_MIN, INT_MAX);
  printf("unsigned int (%zu bytes)\t    0 to %u\n", sizeof(unsigned int),
         UINT_MAX);
  printf("short (%zu bytes)\t\t    %d to %d\n", sizeof(short), SHRT_MIN,
         SHRT_MAX);
  printf("unsigned short (%zu bytes)    0 to %u\n", sizeof(unsigned short),
         USHRT_MAX);
  printf("long (%zu bytes)\t\t    %ld to %ld\n", sizeof(long), LONG_MIN,
         LONG_MAX);
  printf("unsigned long (%zu bytes)\t    0 to %lu\n", sizeof(unsigned long),
         ULONG_MAX);
  printf("long long %zu bytes\t    %lld to %lld\n", sizeof(long long),
         LLONG_MIN, LLONG_MAX);
  printf("unsigned long long (%zu bytes)0 to %llu\n",
         sizeof(unsigned long long), ULLONG_MAX);
  printf("float (%zu bytes)\t\t    %e to %e\n", sizeof(float), FLT_MIN,
         FLT_MAX);
  printf("double (%zu bytes)\t    %e to %e\n", sizeof(double), DBL_MIN,
         DBL_MAX);
  printf("long double %zu bytes\t    %Le to %Le\n", sizeof(long double),
         LDBL_MIN, LDBL_MAX);
  return 0;
}

Η μεταγλώττιση και εκτέλεση του προγράμματος σε έναν υπολογιστή MacOS, με εγκατεστημένο τον μεταγλωττιστή Clang στην έκδοση 15.0.0, θα δώσει την ακόλουθη έξοδο.

% gcc types_sizes_widths.c ‐o types_sizes_widths
% ./types_sizes_widths
clang 15.0.0 detected
Platform: 64 bits
Data Type(Storage Size)         Value Range
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
char (1 byte)                   ‐128 to 127
unsigned char (1 byte)           0 to 255
signed char (1 byte)            ‐128 to 127
int (4 bytes)                   ‐2147483648 to 2147483647
unsigned int (4 bytes)           0 to 4294967295
short (2 bytes)                 ‐32768 to 32767
unsigned short (2 bytes)         0 to 65535
long (8 bytes)                  ‐9223372036854775808 to 9223372036854775807
unsigned long (8 bytes)          0 to 18446744073709551615
long long 8 bytes               ‐9223372036854775808 to 9223372036854775807
unsigned long long (8 bytes)     0 to 18446744073709551615
float (4 bytes)                  1.175494e‐38 to 3.402823e+38
double (8 bytes)                 2.225074e‐308 to 1.797693e+308
long double 8 bytes              2.225074e‐308 to 1.797693e+308
Αποτελέσματα εκτέλεσης σε MacOS Sonoma 14.0, clang 15.0.0.

Στο 1 περιγράφονται οι λεπτομέρειες υλοποίησης ενός προγράμματος που παράγει μια πλήρη αναφορά των ιδιοτήτων του μεταγλωττιστή και του συστήματος. Μεταγλωττίζοντας και εκτελώντας τον κώδικα enquire.c που μπορεί να μεταφορτωθεί από το https://homepages.cwi.nl/~steven/enquire.html λαμβάνεται πληθώρα πληροφοριών για το σύστημα και τον μεταγλωττιστή που χρησιμοποιείται.


  1. Pemberton Steve. The Ergonomics of Software Porting: Automatically Configuring Software to the Runtime Environment. https://homepages.cwi.nl/~steven/enquire/enquire.html. Accessed: 2023-06-01.