代码之家  ›  专栏  ›  技术社区  ›  zephyr

基于字符串输入返回sizeof

  •  3
  • zephyr  · 技术社区  · 7 年前

    我在寻找一种方法,让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 我希望它返回 my_struct_t 在运行时,在我的机器上。

    argv[1]

    2 回复  |  直到 7 年前
        1
  •  3
  •   dbush    7 年前

    不能直接在C中执行类似的操作,因为它没有反射的概念。

    但是,您可以编写一个shell脚本来创建一个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
    
        2
  •  6
  •   Paul    7 年前

    #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; 
    }