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
,length
len
。那很好。它使用
sizeof
。问题是关于问题代码中定义的宏。换句话说,问题不在于
sizeof
 error: expected expression before 'k_count_t'
 error: expected expression before 'k_count_t'