可以#define用于替换c中的类型声明吗?

Sha*_*nit 1 c c-preprocessor

我遇到了一个问题,其中#define用于替换程序中的'int',如下所示

#define type int
int main()
{
 type *a,b;
}
Run Code Online (Sandbox Code Playgroud)

这是有效的吗?虽然它在我试图打印变量b的大小时给了我错误,说b是未声明的.我想知道这背后的具体原因.请告诉我.

有些用户告诉我,我隐藏了部分代码.我没有在上面的代码片段中给出printf语句.下面是printf的代码和给出错误的代码

#define type int;
int main()
{
 type* a, b;
 printf("%d",sizeof(b));
}
Run Code Online (Sandbox Code Playgroud)

Grz*_*ski 6

是的,它可以使用,但请记住,宏和类型定义之间存在显着差异.预处理器替换"机械"每个出现的令牌,同时typedef定义真实类型的同义词,因此后者被认为是推荐的方式.

这是一个简单的例子来说明它在实践中意味着什么:

#define TYPE_INT_PTR int*
typedef int *int_ptr;

int main(void)
{
    TYPE_INT_PTR p1 = 0, p2 = 0;
    int_ptr p3, p4;

    p3 = p1;
    p4 = p2; // error: assignment makes pointer from integer without a cast 

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

你可能期望类型的p2就是int*,但事实并非如此.预处理的行是:

int* p1 = 0, p2 = 0;
Run Code Online (Sandbox Code Playgroud)

另一方面,typedef定义两者p3p4作为指针int.