我遇到了一个问题,在程序中使用#define替换int的位置如下所示
#define type int
int main()
{
type *a,b;
}这是有效的吗?尽管当我试图打印变量b的大小时,它给了我错误,说b是未声明的。我想知道这背后的具体原因。请让我知道。
一些用户告诉我,我隐藏了部分代码。我在上面的代码片段中没有给出printf语句。下面是使用printf的代码和给出错误的代码
#define type int;
int main()
{
type* a, b;
printf("%d",sizeof(b));
}发布于 2015-08-25 18:50:33
是的,它可以使用,但请记住,宏和类型定义之间有很大的区别。预处理器“机械地”替换每个token的出现,而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;
}您可能期望p2的类型是int*,但事实并非如此。预处理行为:
int* p1 = 0, p2 = 0;另一方面,typedef将p3和p4都定义为指向int的指针。
发布于 2015-08-25 19:25:14
对于像你的例子这样的简单类型,它可以工作,尽管它不会像Grzegorz Szpetkowski所说的那样,在同一个语句中声明多个变量时像预期的那样工作。对于更复杂的情况,它可能根本不起作用,因为宏中的文本只能被盲目地替换。
例如,使用typedef声明函数指针
typedef int(*int_func)(int);
func some_function_pointer;你不能使用像上面这样的简单宏,因为函数指针的语法是不同的,而且你还需要不同的宏来声明变量或强制转换变量。
#define int_func_declaration(f) int(*f)(int)
#define int_func_cast(f) ((int(*)(int))f)
int_func_declaration(some_function_pointer) = int_func_cast(some_pointer_value);发布于 2015-08-25 20:28:14
你的程序中的错误是:
#define预处理器命令中不应该有任何半列。type* a,b;行中键入后,*没有任何意义。如果你喜欢声明一个指针,那么你应该像这样声明type *a, b;更正后的代码的Click here。
https://stackoverflow.com/questions/32201486
复制相似问题