将类型传递给C宏
我试图在C宏中传递一个类型,但我得到了一个错误将类型传递给C宏,c,C,我试图在C宏中传递一个类型,但我得到了一个错误 #include <stdio.h>) int size = 0; #define SIZEOF(TYPE) \ TYPE _array_[2]; \ size = (char*)(&_array_[1]) - (char*)(&_array_[0]); int main(int argc, char** argv, char** envp) {
#include <stdio.h>)
int size = 0;
#define SIZEOF(TYPE) \
TYPE _array_[2]; \
size = (char*)(&_array_[1]) - (char*)(&_array_[0]);
int main(int argc, char** argv, char** envp) {
int array[2];
int x = SIZEOF(int);
printf("Size Of Integer = %d", SIZEOF(int));
return 0;
}
#包括)
int size=0;
#定义SIZEOF(类型)\
类型_数组2]\
大小=(字符*)(&_数组[1])-(字符*)(&_数组[0]);
内部主(内部argc、字符**argv、字符**envp){
int数组[2];
int x=SIZEOF(int);
printf(“整数的大小=%d”,SIZEOF(int));
返回0;
}
试试这个:
#define SIZEOF(TYPE) \
({ \
TYPE _array_[2]; \
(char*)(&_array_[1]) - (char*)(&_array_[0]); \
})
…尽管它对表达式中的语句使用了特定于gcc的支持,所以我建议改用标准的sizeof
运算符
如何实际使用:
printf("Size Of Integer = %d", (int)SIZEOF(int));
i、 e.它可以很好地替代编译器上的sizeof
,编译器实际上允许在表达式中使用肮脏的语句。尝试以下方法:
#define SIZEOF(TYPE) \
({ \
TYPE _array_[2]; \
(char*)(&_array_[1]) - (char*)(&_array_[0]); \
})
…尽管它对表达式中的语句使用了特定于gcc的支持,所以我建议改用标准的sizeof
运算符
如何实际使用:
printf("Size Of Integer = %d", (int)SIZEOF(int));
i、 e.在编译器上,它可以很好地替代
sizeof
,而编译器实际上允许在表达式中使用肮脏的语句。宏扩展是一种文本替代。您的代码扩展为:
int x = int _array_[2]; size = (char*)(&_array_[1]) - (char*)(&_array_[0]);
初始部分int x=int
是语法错误
您可以通过编写以下命令使代码正常工作,而无需更改宏:
SIZEOF(int);
printf("Size Of Integer = %d", size);
一种改进是将变量名作为参数传递给宏,而不是使用全局变量。宏扩展是一种文本替换。您的代码扩展为:
int x = int _array_[2]; size = (char*)(&_array_[1]) - (char*)(&_array_[0]);
初始部分int x=int
是语法错误
您可以通过编写以下命令使代码正常工作,而无需更改宏:
SIZEOF(int);
printf("Size Of Integer = %d", size);
一个改进是将变量名作为参数传递给宏,而不是使用全局变量。您是否注意到您无意中发布了两次相同的问题?它返回-ecantparse可能重复我知道这不是您所问问题的答案,但是我觉得我应该提到的是,
sizeof
是存在的。一个问题重复的原因是它“以前被问过,并且已经有了答案”,这意味着你的两个问题现在都是重复的,因为它们都有答案。你是否注意到你无意中发布了两次相同的问题?它返回-ecantparse可能是重复的我知道这不是你所问问题的答案,但是我觉得我应该提到的是,sizeof
是存在的。一个问题重复的原因是它“以前被问过,并且已经有了答案”,这意味着你的两个问题现在都是重复的,因为它们都有答案。在ansi c之前的日子里,编译器使用了一个宏,IIRC:(int)(&((TYPE*)0)[1]))或类似的。基本上,将0强制转换为类型的指针并找到[1]的地址,然后将该地址强制转换回数字。当然,现在不需要了,所有感兴趣的编译器都有SizeofCompiler,在ANSIC之前的日子里,它们使用了这样的宏,IIRC:(int)(&((TYPE*)0)[1])或类似的宏。基本上,将0强制转换为类型的指针并找到[1]的地址,然后将该地址强制转换回数字。当然,现在不需要了,所有有趣的编译器都有sizeof