如何在c中编写数据类型数组

vuktfyat  于 2023-04-05  发布在  其他
关注(0)|答案(1)|浏览(110)

我想sizeof的数据类型在for循环.我写的功能与宏打印sizeof的参数(参数是数据类型).我需要使用结构与数据类型元素和索引他们.我如何才能实现它或如何解决这个问题?
验证码:

#define t_array = [ int, float ];
#define t_size(type) printf("%d", sizeof(type));

int main()
{
    t_size(t_array[0]);
    return 0;
}
rsl1atfo

rsl1atfo1#

不可能有一个数据类型数组。
相反,你可以使用预处理器来拥有一个令牌数组。

#include <stdio.h>

#define ARRAY  int, float

#define GET_1(_1) _1
#define GET_2(_1,...) GET_1(__VA_ARGS__)
#define GET_3(_1,...) GET_2(__VA_ARGS__)
#define GET_N2(_3,_2,_1,N,...)  GET##N
#define GET_N(...)  GET_N2(__VA_ARGS__,_3,_2,_1)
// GET idx argument from comma separated tokens
#define GET(array, idx)  GET_N(array)(array)

int main() {
   printf("%zu\n", sizeof(GET(ARRAY, 0)));
}

或者你可以将大小(和其他类型抽象)属性存储在数组中,其中包含每种类型的元素。(这是最重要的,它与虚拟函数一起使用,虚拟函数抽象了每种类型上的操作,并产生了漂亮的非意大利面条代码,但调用虚拟函数会导致运行时开销)。

#include <stdio.h>

struct type_property {
    size_t size;
};

#define TYPE_PROPERTY_INIT(type)  { sizeof(type) }

struct type_property properties[] = {
    TYPE_PROPERTY_INIT(int),
    TYPE_PROPERTY_INIT(float),
};

int main() {
   printf("%zu\n", properties[0].size);
}

等等,在C编程语言中还有其他的方法来编写类型抽象或模板化代码,它们以一种巧妙的方式使用这些代码。比如你可以用预处理器生成函数:

#include <stdio.h>

#define TYPESTUFF_DECL(SUFFIX, TYPE) \
size_t typestuff_size_##SUFFIX(void) { \
    return sizeof(TYPE); \
}

TYPESTUFF_DECL(0, int)
TYPESTUFF_DECL(1, float)

int main() {
   printf("%zu\n", typestuff_size_0());
}

或者你可以有一个完整的文件,在令牌上模板化来生成这些函数(参见ex.STC的用法):

// typestuff.h

#ifndef TYPESTUFF_H_
#define TYPESTUFF_H_
#define TYPESTUFF_CONCAT(a, b)  a##b
#define TYPESTUFF_CONCATX(a, b)  TYPESTUFF_CONCAT(a, b)
#endif

static size_t TYPESTUFF_CONCATX(typestuff_size_, SUFFIX)(void) {
    return sizeof(TYPE);
}

#undef SUFFIX
#undef TYPE

// main.c
#include <stdio.h>

#define SUFFIX 0
#define TYPE int
#include <typestuff.h>

#define SUFFIX 1
#define TYPE float
#include <typestuff.h>

int main() {
   printf("%zu\n", typestuff_size_0());
}

或者你可以枚举每种类型,并写一个很大很丑很糟糕的case语句来维护,请不要这样做,因为你最终会得到这个DLMS库:

#include <stdio.h>
#include <assert.h>

enum types {
   TYPE_INT,
   TYPE_FLOAT,
};

size_t types_sizeof(enum types idx) {
   switch (idx) {
      case TYPE_INT: return sizeof(int);
      case TYPE_FLOAT: return sizeof(float);
   };
   assert(0);
}

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

请注意,要将size_t打印为sizeof的结果,您应该使用%zu

相关问题