*   >> Чтение Образование Статьи >> science >> programming

Введение в макросы в C

<р> Почти все уже определено постоянной в C помощью #define ФИКС 12345

, но только небольшая группа действительно знает, что делает и линии, как исследовать эти функции. Каждая строка, которая начинается с # не обрабатывается компилятором C, а по предварительной процессора C, который анализирует эти строки и производит код, который будет эффективно быть скомпилирован. В GCC, вы можете увидеть результат на этапе предварительной обработки с помощью GCC -E src.

cWhat директивы определить

делает сделать препроцессор заменить каждое вхождение определения в тексте, который следует за. Замена чисто текстовая и есть несколько трюков, которые действительно удивительным. Я буду говорить о двух из них: функция, как макросы и многоканальная линия macros.Function, как macrosTo сделать функцию, как макро просто поставить обычную скобку после имени макроса и следовать имя своих аргументов. Аргументы будут заменены точная строка, что вы проходите в макрос.

Быстрый пример #define print_int (х) Е ("Int% D \\ N", х); При вызове print_int (30), макрос будет расширяться toprintf ("Int% D \\ N", 30); Многострочный macrosA многострочный макрос может быть построен положить \\ в конце всего линии макроса. Этот символ указывает, что макрос продолжается на следующей строке. #define SWAP (а, б) {\\ а ^ = Ь; \\ Ь = а; \\ А ^ = Ь; \\} Скобки необходимы, поскольку этот блок должен быть оценен как одной инструкции.

Без него, следующий будет не в состоянии:

если (A> B) SWAP (A, B) Макросы dangerousMacros производит ошибки, которые трудно отлаживать и сложно патч. Возможные ловушки много (ошибки в приоритете операторов, автореферентными макросов, и т.д.). Эта страница все из них действительно хорошо документированы. Это было небольшое введение к более продвинутой использования C макросов. Препроцессор является мощным средством и может быть использован, чтобы сделать много хорошего материала. Чтобы узнать больше об этом можно посетить этот сайт.



Copyright © 2008 - 2016 Чтение Образование Статьи,https://ru.nmjjxx.com All rights reserved.