Are typedef and #define the same in c? Are typedef and #define the same in c? c c

Are typedef and #define the same in c?


typedef obeys scoping rules just like variables, whereas define stays valid until the end of the compilation unit (or until a matching undef).

Also, some things can be done with typedef that cannot be done with define.
For example:

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


No.

#define is a preprocessor token: the compiler itself will never see it.
typedef is a compiler token: the preprocessor does not care about it.

You can use one or the other to achieve the same effect, but it's better to use the proper one for your needs

#define MY_TYPE inttypedef int My_Type;

When things get "hairy", using the proper tool makes it right

#define FX_TYPE void (*)(int)typedef void (*stdfx)(int);void fx_typ(stdfx fx); /* ok */void fx_def(FX_TYPE fx); /* error */


No, they are not the same. For example:

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

After preprocessing, that line expands to

int* a, b;

Hopefully you see the problem; only a will have the type int *; b will be declared a plain int (because the * is associated with the declarator, not the type specifier).

Contrast that with

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

In this case, both a and b will have type int *.

There are whole classes of typedefs that cannot be emulated with a preprocessor macro, such as pointers to functions or arrays:

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

Try doing that with a preprocessor macro.