Рубрики

typedef против #define в C

typedef : typedef используется, чтобы дать типу данных новое имя. Например,

// C программа для демонстрации typedef
#include <stdio.h>

  
// После этой строки можно использовать BYTE
// вместо неподписанного символа

typedef unsigned char BYTE;

  

int main()

{

    BYTE b1, b2;

    b1 = 'c';

    printf("%c ", b1);

    return 0;

}

Выход:

c

#define в C — это директива, которая используется для определения псевдонима.

// C программа для демонстрации #define
#include <stdio.h>

  
// После этой строки HYD заменяется на
// "Хайдарабад"
#define HYD "Hyderabad"

  

int main()

{

    printf("%s ", HYD);

    return 0;

}

Выход:

Hyderabad

Разница между typedef и #define:

  1. typedef ограничен предоставлением символических имен только для типов, тогда как #define может также использоваться для определения псевдонима для значений, например, вы можете определить 1 как ONE, 3.14 как PI и т. д.
  2. Интерпретация typedef выполняется компилятором, где операторы #define выполняются препроцессором.
  3. #define не должен заканчиваться точкой с запятой, но typedef должен заканчиваться точкой с запятой.
  4. #define будет просто копировать и вставлять значения определения в точке использования, тогда как typedef является фактическим определением нового типа.
  5. typedef следует правилу области, что означает, что если в области (внутри функции) определен новый тип, то имя нового типа будет видимо только до тех пор, пока область не будет там. В случае #define, когда препроцессор встречает #define, он заменяет все вхождения, после этого (правило области не соблюдается).

// C программа для демонстрации важности
// typedef over #define для типов данных
#include <stdio.h>

typedef char* ptr;

#define PTR char*

int main()

{

    ptr a, b, c;

    PTR x, y, z;

    printf("sizeof a:%u\n" ,sizeof(a) );

    printf("sizeof b:%u\n" ,sizeof(b) );

    printf("sizeof c:%u\n" ,sizeof(c) );

    printf("sizeof x:%u\n" ,sizeof(x) );

    printf("sizeof y:%u\n" ,sizeof(y) );

    printf("sizeof z:%u\n" ,sizeof(z) );

    return 0;

}

Выход:

sizeof a:8
sizeof b:8
sizeof c:8
sizeof x:8
sizeof y:1
sizeof z:1

По результатам вышеприведенной программы размер «a», который является указателем, равен 8 (на машине, где указатели хранятся с использованием 8 байтов). В приведенной выше программе, когда компилятор приходит к

typedef char* ptr;
ptr a, b, c;

утверждение эффективно становится

char *a, *b, *c;

Это объявляет a, b, c как char *.

В отличие от этого, #define работает так:

#define PTR char*
PTR x, y, z;

утверждение эффективно становится

char *x, y, z;

Это делает x, y и z различными, поскольку x — это указатель на символ, тогда как y и z — переменные типа char. Когда мы объявляем макросы с указателями при определении, если мы объявляем более одного идентификатора, то фактическое определение дается первому идентификатору, а для остальных дается определение без указателя. В приведенном выше случае x будет объявлен как char *, поэтому его размер равен размеру указателя, тогда как y и z будут объявлены как char, поэтому их размер будет равен 1 байту.

Эта статья предоставлена HARISH KUMAR . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

typedef против #define в C

0.00 (0%) 0 votes