c - 枚举 C 中的基本数据类型,以便轻松访问大小
问题描述
是否可以使用 for 循环获取 C 中所有基本数据类型的大小?例如,我们可以做这样的事情吗?
#include <datatypes.h> /* or something else which defines get_data_types() */
#include <stdio.h>
int main() {
for (int x = 0; x < len(get_data_types()); x++) {
printf("Size of %s is %d", get_data_types()[x], sizeof(get_data_types()[x]));
}
}
我可以通过替换 for 循环并为int
,long
等编写单独的语句来枚举所有数据类型。但是,我想知道是否可以使用 for 循环来做同样的事情?
本质上,我试图避免以下情况:
#include <stdio.h>
int main() {
printf("Size of int is %d", sizeof(int);
printf("Size of unsigned int is %d", sizeof(unsigned int);
printf("Size of long is %d", sizeof(long);
/* etc. */
return 0;
}
感兴趣的数据类型- char
, unsigned char
, signed char
, int
, unsigned int
, short
, unsigned short
, long
, unsigned long
, float
, double
,long double
澄清:我不一定想要一个混合类型的数组,但能够枚举类型以便可以轻松访问大小。
解决方案
不,这是不可能的。无法自动列出 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);
}
(代码简化,灵感来自 Paul Ogilvie 下面的回答。)
在对此答案的评论中,您问:我们可以创建一个如下所示的数组:types_array = {"int", "char", "double", "long"} 并在迭代时获得相应的大小?我的意思是说使用一些函数 f,我们可以将 types[j].size 分配给 sizeof(f(types_array[j]))
简而言之,没有。这是因为 C 是一种强类型编译语言。在像 Python 和 PHP 这样的语言中,你可以做各种各样的花哨的事情,但在 C 中则不行。并非没有诡计。您示例中的函数f
必须具有指定的返回类型,这是sizeof
将作为参数获取的类型。
解决它的一种方法是编写自定义 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);
}
推荐阅读
- java - Java/Kotlin 中时区的操作逻辑是什么?
- r - r - 查找所有组合,不包括来自同一组的组合
- java - Dockerization 失败,在应用程序构建期间
- javascript - 功能没有做简单的控制台日志作为测试,不知道为什么
- c++ - 如何在同一个项目中调用C层中的C++函数?
- node.js - 响应架构
- spring - Kinesis 的 Spring Project Reactor
- python - 有没有办法确定字符串中是否有奇数个引号?
- css - 如何正确使用“&”嵌套 SCSS 以重用直接父(部分)类名?
- excel - VBA 宏循环遍历单元格、查找匹配项并复制相邻单元格