Нет, это невозможно. Нет никакого способа автоматически перечислить все типы в C. Вы должны сделать это вручную для каждого типа.
Однако, если вы много используете информацию, вы всегда можете подготовить список заранее. Есть несколько способов сделать это. Это один:
#include <stdio.h>
#include <string.h>
typedef struct {
char name[20];
int size;
} type;
int main()
{
type types[3] = { {"int", sizeof (int) },
{"char", sizeof (char) },
{"double", sizeof (double) } };
for (int x = 0; x<sizeof(types)/sizeof(types[0]); x++)
printf("Size of %s is %d\n", types[x].name, types[x].size);
}
(Код упрощен благодаря вдохновению от ответа Пола Огилви ниже.)
В комментарии к этому ответу вы спросили: Можем ли мы просто создать массив, подобный следующему: types_array = {"int", "char", "double", "long"} и, повторяя это, получить соответствующие размеры? Я хочу сказать, используя некоторую функцию f, можем ли мы присвоить типы [j] .size для sizeof (f (types_array [j])) *
Короче, нет. Это потому, что C - это строго типизированный скомпилированный язык В таких языках, как Python и PHP, вы можете делать все подобные вещи, но в C нет. Не без обмана. Функция f
в вашем примере должна иметь указанный тип возвращаемого значения, и этот тип sizeof
получит в качестве аргумента.
Один из способов обойти это - написать нестандартный размер:
int mysizeof(char * s) {
if(strcmp(s, "char") == 0)
return sizeof(char);
if(strcmp(s, "int") == 0)
return sizeof(int);
}
Если этот список длинный, вы можете использовать макрос:
#define MYSIZEOF(x) if(strcmp(s, #x) == 0) return sizeof(x)
int mysizeof(char * s) {
MYSIZEOF(int);
MYSIZEOF(char);
MYSIZEOF(double);
}