Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将类型传递给C宏_C - Fatal编程技术网

将类型传递给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) {

我试图在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) {
        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