Возвращает sizeof на основе ввода строки - PullRequest
0 голосов
/ 09 октября 2018

Я ищу способ иметь функцию в C, которая принимает в качестве входных данных строку, определяющую конкретный тип переменной.Затем функция возвращает результат sizeof этого ввода, как если бы строка была оценена как тип.Рассмотрим приведенный ниже пример.

#include <stdint.h>

typedef struct my_struct {
    int16_t var1;
    int16_t var2;
    int16_t var3;
} mystruct_t;

int main(int argc, char * argv[])
{
    return sizeof(argv[1]); // THIS IS WRONG!!
}

Затем пользователь может скомпилировать это и попытаться вызвать ./myprogram my_struct_t, где, как я ожидаю, будет возвращен фактический размер байта C my_struct_t во время выполнения на моей машине.

Компонент этого, в котором я не уверен, состоит в том, что, очевидно, он получает размер (указатель на) строки, хранящейся в argv[1], а не размер типа, определенного строкой.Как я могу сделать это преобразование?Это вообще возможно?

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Вы не можете сделать что-то подобное непосредственно в C, поскольку у него нет концепции отражения.

Однако вы можете написать сценарий оболочки для создания программы на C, которая определяет типВы даете его, компилируете и запускаете, чтобы получить размер.

#!/bin/bash

type=$1

cat > size.c  << EOF
#include <stdio.h>

typedef $type thetype;

int main()
{
    printf("%zu\n", sizeof(thetype));
    return 0;
}
EOF

gcc -o size size.c
./size
rm size size.c

Пример ввода / вывода:

ubuntu@ubuntu:~$ ./x1.sh int
4
ubuntu@ubuntu:~$ ./x1.sh double
8
ubuntu@ubuntu:~$ ./x1.sh "struct { int a; char b; }"
8
ubuntu@ubuntu:~$ ./x1.sh "struct { int a; char b; double c; }"
16
0 голосов
/ 09 октября 2018

Вы можете сделать это с помощью ряда операторов if.Добавьте по одному для каждого типа, который вы хотите разрешить вызывающей стороне:

#include <stdint.h>
#include <string.h>

typedef struct my_struct {
    int16_t var1;
    int16_t var2;
    int16_t var3;
} my_struct_t;

int main(int argc, char * argv[])
{

    const char * str;

    if ( argc <= 1 )
        return -1;

    str = argv[1];

    if ( 0 == strcmp( str, "int" ) ) 
        return sizeof( int );

    if ( 0 == strcmp( str, "int16_t" ) ) 
        return sizeof( int16_t );

    if ( 0 == strcmp( str, "struct my_struct" ) ) 
        return sizeof( struct my_struct );

    if ( 0 == strcmp( str, "my_struct_t" ) ) 
        return sizeof( my_struct_t );

    return -1; 
}
...