Главная страница
Навигация по странице:

  • Visual Studio

  • Директива undef

  • Кроме стандартных заголовочных файлов мы можем подключать и свои. C. Например, в нашем в файле main c


    Скачать 20.47 Kb.
    НазваниеC. Например, в нашем в файле main c
    Дата16.09.2022
    Размер20.47 Kb.
    Формат файлаdocx
    Имя файлаКроме стандартных заголовочных файлов мы можем подключать и свои.docx
    ТипДокументы
    #680188

    Кроме стандартных заголовочных файлов мы можем подключать и свои файлы. Например, в той же папке, где находиться главный файл программы, определим еще один файл, который назовем main.c. Определим в нем следующий код:

    1

    int number = 5;

    Здесь просто определена одна переменная. Теперь подключим этот файл в программу:

    1

    2

    3

    4

    5

    6

    7

    8

    #include

    #include "main.c"

     

    int main(void)

    {

        printf("%d", number);   // 5

        return 0;

    }

    При подключении своих файлов их имя указывается в кавычках. И несмотря на то, что в программе не определена переменная number, она будет браться из подключенного файла main.c. Но опять же отмечу, важно, что в данном случае файл main.c располагается в одной папке с главным файлов программы.

    В то же время данный способ прекрасно работает в GCC. Но для разных сред программирования способ подключения файлов может отличаться. Например, в Visual Studio мы получим ошибку. И более правильный подход будет состоять в том, что определить объявление объекта (переменной/константы) или функции в дополнительном заголовочном файле, а определение объекта или функции поместить в стандартный файл с расширением .c.

    Например, в нашем в файле main.c уже есть определение переменной number. Теперь в ту же папку добавим новый файл main.h - файл с тем же названием, но другим расширением. И определим в main.h следующий код:

    1

    extern int number;

    Ключевое слово extern указывает, что данный объект является внешним. И в этом случае мы могули бы его подключить в файл исходного кода:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    #include

    #include "main.h"       // объявление или описание объекта

    #include "main.c"       // определение объекта

     

    int main(void)

    {

        printf("%d", number);

        return 0;

    }

    Этот пример также будет работать в GCC, однако как уже было рассмотрено выше, подключение файла main.h для GCC необязательно.

    Если разработка ведется в Visual Studio, то определение объекта не надо подключать исходный файл:

    1

    2

    3

    4

    5

    6

    7

    8

    #include

    #include "main.h"       // объявление или описание объекта

     

    int main(void)

    {

        printf("%d", number);

        return 0;

    }

    Несмотря на то, что здесь явным образом не подключается файл main.c, но при трансляции Visual Studio через заголовочный файл main.h сможет подключить находящийся в той же папке файл main.c.

    Директива #define определяет идентификатор и последовательность символов, которые будут подставляться вместо идентификатора каждый раз, когда он встретится в исходном файле. Формальное определение директивы:

    1

    #define идентификатор последовательность_символов

    Используем директиву #define:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    #define BEGIN {

    #define END }

    #define N 23

     

    int main(void)

    BEGIN

        int x = N;

        return 0;

    END

    Здесь определены три идентификатора BEGIN, END, N. Как правило, идентификаторы имеют имена в верхнем регистре, хотя это необязательно, можно определять имена и строчными символами.

    В итоге все вхождения последовательности символов "BEGIN" будут заменяться на открывающую фигурную скобку, а "END" - на закрывающую, а символ "N" на число 23.

    Таким образом, после обработки препроцессора программа приобретет следующий вид:

    1

    2

    3

    4

    5

    int main(void)

    {

        int x = 23;

        return 0;

    }

    Для идентификатора необязательно определять последовательность символов, можно ограничиться одним идентификаторов:

    1

    #define DEBUG

    Особенно удобно использовать директиву #define для определения размеров массивов:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    #include

     

    #define N 4

     

    int main(void)

    {

        int numbers[N] = {1, 2, 3, 4};

        for(int i=0; i
        {

            printf("%d ", numbers[i]);

        }

        return 0;

    }

    В данном случае если мы захотим глобально поменять размер массива, то достаточно изменить значение N в директиве define.

    Следует учитывать, что директива препроцессор не заменяет последовательности символов в двойных и одинарных кавычках и в комментариях:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    #include

     

    #define N 4

     

    int main(void)

    {

        char symbol = 'N';

        printf("%c \n", symbol);    // N

        printf("N");                //N

        return 0;

    }

    Причем если идентификатор должен представлять одно слово, то его последовательность символов может состоять из нескольких слов или символов, разделенных пробелами:

    1

    #define REAL long double

    Директива #undef

    В процессе работы мы можем многократно определять новое значение для одного идентификатора:

    1

    2

    3

    #define N 23

    #define N 32

    #define N 55

    Но некоторые компиляторы, в частности, gcc, могут выдавать предупреждения при повторном определении идентификатора, и чтобы выйти из этой ситуации, мы можем использовать директиву #undef для отмены действия макроса. Эта директива имеет следующее определение:

    1

    #undef идентификатор

    Например:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    #include

     

    #define STRING "Good morning \n"

     

    int main(void)

    {

        printf(STRING);

        #undef STRING

        #define STRING "Good afternoon \n"

        printf(STRING);

        #undef STRING

        #define STRING "Good evening \n"

        printf(STRING);

        return 0;

    }


    написать администратору сайта