首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >#define可以用来替换c中的类型声明吗?

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

Stack Overflow用户
提问于 2015-08-25 18:24:23
回答 3查看 1.9K关注 0票数 2

我遇到了一个问题,在程序中使用#define替换int的位置如下所示

代码语言:javascript
运行
复制
#define type int
int main()
{
 type *a,b;
}

这是有效的吗?尽管当我试图打印变量b的大小时,它给了我错误,说b是未声明的。我想知道这背后的具体原因。请让我知道。

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

代码语言:javascript
运行
复制
#define type int;
int main()
{
 type* a, b;
 printf("%d",sizeof(b));
}
EN

回答 3

Stack Overflow用户

发布于 2015-08-25 18:50:33

是的,它可以使用,但请记住,宏和类型定义之间有很大的区别。预处理器“机械地”替换每个token的出现,而typedef定义了真正的类型同义词,因此后者被认为是推荐的方式。

这里有一个简单的例子来说明它在实践中的意义:

代码语言:javascript
运行
复制
#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*,但事实并非如此。预处理行为:

代码语言:javascript
运行
复制
int* p1 = 0, p2 = 0;

另一方面,typedefp3p4都定义为指向int的指针。

票数 6
EN

Stack Overflow用户

发布于 2015-08-25 19:25:14

对于像你的例子这样的简单类型,它可以工作,尽管它不会像Grzegorz Szpetkowski所说的那样,在同一个语句中声明多个变量时像预期的那样工作。对于更复杂的情况,它可能根本不起作用,因为宏中的文本只能被盲目地替换。

例如,使用typedef声明函数指针

代码语言:javascript
运行
复制
typedef int(*int_func)(int);
func some_function_pointer;

你不能使用像上面这样的简单宏,因为函数指针的语法是不同的,而且你还需要不同的宏来声明变量或强制转换变量。

代码语言:javascript
运行
复制
#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);
票数 1
EN

Stack Overflow用户

发布于 2015-08-25 20:28:14

你的程序中的错误是:

  1. #define预处理器命令中不应该有任何半列。
  2. type* a,b;行中键入后,*没有任何意义。如果你喜欢声明一个指针,那么你应该像这样声明type *a, b;
  3. You忘记在代码的开头包含stdio.h头文件

更正后的代码的Click here

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32201486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档