我已经实现了我的自定义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;
}
答案 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支持声明表达肯定,我不知道任何其他编译器。