做之前的预期表达。宏使用do while循环

时间:2015-09-16 21:46:47

标签: c macros

我已经实现了我的自定义sizeof运算符,如下所示

#define my_sizeof(x) do{\
    typeof(x) _a;\
    (char*)(&_a + 1) - (char*)(&_a);\
}while(0)

如果我编译它我会收到错误

test.c:26:22: error: expected expression before ‘do’

无法弄清楚我做错了什么。

我的主要功能如下。

int main()
{
   int a;

   unsigned long long b;
   double c;

   printf("size of a %zd \n",my_sizeof(a));
   printf("size of b %zd \n",my_sizeof(b));
   printf("size of c %zd \n",my_sizeof(c));
   return 0;
}

3 个答案:

答案 0 :(得分:4)

您的宏扩展为do循环。 do循环不是表达式,也不会生成值。编译器告诉你,你不能使用do循环来尝试使用它,这是正确的。

C中没有干净的替代方法,因为您无法在表达式中声明变量。

答案 1 :(得分:2)

这是因为宏的预处理方式。预处理器输出(您可能使用gcc -E file.c获得)将如下所示(仅为a变量剥离):

int main() {
    int a;
    printf("size of a %zd \n", do { typeof(a) _a; (char*)(&_a + 1) - (char*)(&_a); } while (0));
    return 0;
}

这不是正确的C语法。你可以像这样使用do..while宏(没有赋值或将它嵌套在另一个函数中):

MY_MACRO(x);

有关更多信息,请参阅this article

答案 2 :(得分:1)

do / while循环无法返回值。你可以使用GCC风格的statement expression来做你正在尝试的事情:

#define my_sizeof(x) ({              \
    typeof(x) _a;                    \
    (char*)(&_a + 1) - (char*)(&_a); \
})

Clang& GCC支持声明表达肯定,我不知道任何其他编译器。