我想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; }
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。
size_t
sizeof
%zu
1条答案
按热度按时间rsl1atfo1#
不可能有一个数据类型数组。
相反,你可以使用预处理器来拥有一个令牌数组。
或者你可以将大小(和其他类型抽象)属性存储在数组中,其中包含每种类型的元素。(这是最重要的,它与虚拟函数一起使用,虚拟函数抽象了每种类型上的操作,并产生了漂亮的非意大利面条代码,但调用虚拟函数会导致运行时开销)。
等等,在C编程语言中还有其他的方法来编写类型抽象或模板化代码,它们以一种巧妙的方式使用这些代码。比如你可以用预处理器生成函数:
或者你可以有一个完整的文件,在令牌上模板化来生成这些函数(参见ex.STC的用法):
或者你可以枚举每种类型,并写一个很大很丑很糟糕的case语句来维护,请不要这样做,因为你最终会得到这个DLMS库:
请注意,要将
size_t
打印为sizeof
的结果,您应该使用%zu
。