首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在c中,define和#是否定义相同?

在c中,define和#是否定义相同?
EN

Stack Overflow用户
提问于 2009-11-03 17:57:30
回答 7查看 72.5K关注 0票数 135

我想知道在ctypedef#define是否相同

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-11-03 17:59:29

不是的。

#define是一个预处理器令牌:编译器本身永远看不到它。

typedef是一个编译器标记:预处理器并不关心它。

您可以使用其中一种或另一种来达到相同的效果,但最好根据需要使用适当的一种

#define MY_TYPE int
typedef int My_Type;

当事情变得“乱七八糟”时,使用适当的工具可以让它变得正确

#define FX_TYPE void (*)(int)
typedef void (*stdfx)(int);

void fx_typ(stdfx fx); /* ok */
void fx_def(FX_TYPE fx); /* error */
票数 132
EN

Stack Overflow用户

发布于 2009-11-03 18:03:06

typedef与变量一样遵循作用域规则,而define在编译单元结束(或匹配的undef)之前一直有效。

此外,一些不能用define完成的事情可以用typedef完成。

例如:

typedef int* int_p1;
int_p1 a, b, c;  // a, b, c are all int pointers

#define int_p2 int*
int_p2 a, b, c;  // only the first is a pointer, because int_p2
                 // is replaced with int*, producing: int* a, b, c
                 // which should be read as: int *a, b, c
typedef int a10[10];
a10 a, b, c;  // create three 10-int arrays
typedef int (*func_p) (int);
func_p fp;  // func_p is a pointer to a function that
            // takes an int and returns an int
票数 238
EN

Stack Overflow用户

发布于 2009-11-03 23:52:50

不,它们是不一样的。例如:

#define INTPTR int*
...
INTPTR a, b;

在预处理之后,该行扩展为

int* a, b;

希望您能看到问题所在;只有a将具有类型int *b将被声明为普通的int (因为*与声明符相关联,而不是与类型说明符相关联)。

与此形成对比

typedef int *INTPTR;
...
INTPTR a, b;

在本例中,ab的类型都是int *

有一些完整的typedefs类是不能用预处理器宏来模拟的,比如指向函数或数组的指针:

typedef int (*CALLBACK)(void);
typedef int *(*(*OBNOXIOUSFUNC)(void))[20]; 
...
CALLBACK aCallbackFunc;        // aCallbackFunc is a pointer to a function 
                               // returning int
OBNOXIOUSFUNC anObnoxiousFunc; // anObnoxiousFunc is a pointer to a function
                               // returning a pointer to a 20-element array
                               // of pointers to int

尝试使用预处理器宏来实现这一点。

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

https://stackoverflow.com/questions/1666353

复制
相关文章

相似问题

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