C 我的宏大小不为';不适用于枚举数据类型
我得到以下错误:C 我的宏大小不为';不适用于枚举数据类型,c,sizeof,C,Sizeof,我得到以下错误: #define my_sizeof_one(type) (char *)(&type+1)-(char*)(&type) int main(void) { int answer; short x = 1; long y = 2; float u = 3.0; double v = 4.4; long double w = 5.54; char c = 'p'; uint32_t e = 653; uint
#define my_sizeof_one(type) (char *)(&type+1)-(char*)(&type)
int main(void)
{
int answer;
short x = 1;
long y = 2;
float u = 3.0;
double v = 4.4;
long double w = 5.54;
char c = 'p';
uint32_t e = 653;
uint16_t f = 44;
uint64_t g = 2323232;
typedef enum
{
kCountInvalid,
kCountOne,
kCountTwo,
kCountThree,
kCountFour,
}k_count_t;
/* __DATE__, __TIME__, __FILE__, __LINE__ are predefined symbols */
#if 1
printf("Date : %s\n", __DATE__);
printf("Time : %s\n", __TIME__);
printf("File : %s\n", __FILE__);
printf("Line : %d\n", __LINE__);
#endif
/* The size of various types */
printf("The size of int %zu\n", my_sizeof_one(answer));
printf("The size of short %zu\n", my_sizeof_one(x));
printf("The size of long %zu\n", my_sizeof_one(y));
printf("The size of float %zu\n", my_sizeof_one(u));
printf("The size of double %zu\n", my_sizeof_one(v));
printf("The size of long double %zu\n", my_sizeof_one(w));
printf("The size of char %zu\n", my_sizeof_one(c));
printf("The size of enum %zu\n", my_sizeof_one(k_count_t));
printf("The size of uint16_t %zu\n", my_sizeof_one(f));
printf("The size of uint32_t %zu\n", my_sizeof_one(e));
printf("The size of uint64_t %zu\n", my_sizeof_one(g));
return 0;
}
出于某种原因,my_sizeof似乎不适用于C中的枚举数据类型。有人能解释一下原因吗?问题是您正在将类型传递给宏,而宏不适用于类型。因为您无法获取类型的地址 尽管您已将宏的参数命名为
类型
,但该名称有误导性。宏接受变量而不是类型。严格来说,它接受任何可以使用&
操作符获取地址的内容。请注意,宏的所有其他用法都与变量有关。为宏提供一个k\u count\t
类型的变量,编译器会很高兴的
当然,真正需要学习的是使用
sizeof
,就像大自然想要的那样。用k\u count\u t写出你的宏和sub作为类型-答案应该是显而易见的。您不能接受类型的地址。所有其他用法看起来都像是传递变量。但是C中的normal sizeof()内置宏确实适用于枚举数据类型“normal sizeof()”不是宏,而是编译器理解的运算符这里有两种形式的sizeof
。一个采用表达式作为操作数,另一个采用括号中的类型名称。您不能编写自己的宏来处理这两种情况(除非它只是调用sizeof
,但在调用它时,您必须使用额外的括号)。@ryker我不这么认为。问题中的代码不会在任何地方编译。但是C中的普通sizeof()内置宏适用于枚举数据类型。请重新阅读答案。这个问题与枚举没有任何关系。问题在于类型和变量之间的区别。请注意,sizeof
不是宏。有人想知道为什么不使用sizeof
。也许举个例子会有所帮助。printf(“int%zu\n的大小”,my_sizeof_one(int));他也有同样的问题。printf(“短%zu\n的大小”,my_sizeof_one(短));等等@DavidHeffernan——我看到的是int*var=malloc(sizeof(int)*len)
那么这也不正确吗?@ryker分配了一个数组int
,lengthlen
。那很好。它使用sizeof
。问题是关于问题代码中定义的宏。换句话说,问题不在于sizeof
。
error: expected expression before 'k_count_t'
error: expected expression before 'k_count_t'