繁体   English   中英

根据字符串输入返回sizeof

[英]Return sizeof based on string input

我正在寻找一种在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的实际C字节大小。

我不确定这个的组成部分显然这会得到存储在argv[1]中的(指向)字符串的大小,而不是字符串定义的类型的大小。 我怎样才能进行这种转换? 这甚至可能吗?

您可以使用一系列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; 
}

你不能直接用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM