Latest web development tutorials
×

C курс

C Язык учебника C Краткое введение C параметры окружающей среды C Структура программы C Базовый синтаксис C Типы данных C переменная C постоянная C Storage Class C операторы C судья C циркуляция C функция C Обзорное правила C массив C указатель C строка C структура C союз C поле Bit C typedef C Входной и Выходной C грамотность документов C препроцессор C заголовок C Слепки C Обработка ошибок C Рекурсия C Переменный параметр C Управление памятью C Параметры командной строки C Классические 100 случаев

C Стандартная библиотека

C Стандартная библиотека - справочное руководство C Стандартная библиотека - <assert.h> C Стандартная библиотека - <ctype.h> C Стандартная библиотека - <errno.h> C Стандартная библиотека - <float.h> C Стандартная библиотека - <limits.h> C Стандартная библиотека - <locale.h> C Стандартная библиотека - <math.h> C Стандартная библиотека - <setjmp.h> C Стандартная библиотека - <signal.h> C Стандартная библиотека - <stdarg.h> C Стандартная библиотека - <stddef.h> C Стандартная библиотека - <stdio.h> C Стандартная библиотека - <stdlib.h> C Стандартная библиотека - <string.h> C Стандартная библиотека - <time.h>

C препроцессор

ЧастьC препроцессором не компилятор, но это процесс компиляции отдельной стадии.Короче говоря, препроцессор это просто инструмент текст подстановки только они будут инструктировать для компиляции полной предварительной обработки перед фактической потребности. Мы будем препроцессор С (С Препроцессор) сокращенно CPP.

Все заказы препроцессор со знаком фунта (#) в начале. Это должно быть первым непустой символ, с тем чтобы повысить читаемость, директивы препроцессора должна начинаться в первом столбце. Ниже перечислены все важные инструкции препроцессора:

指令描述
#define定义宏
#include包含一个源代码文件
#undef取消已定义的宏
#ifdef如果宏已经定义,则返回真
#ifndef如果宏没有定义,则返回真
#if如果给定条件为真,则编译下面代码
#else#if 的替代方案
#elif如果前面的 #if 给定条件不为真,当前条件为真,则编译下面代码
#endif结束一个 #if……#else 条件编译块
#error当遇到标准错误时,输出错误消息
#pragma使用标准化方法,向编译器发布特殊的命令到编译器中

Примеры предварительной обработки

Анализ, чтобы понять, можно привести следующие примеры различных инструкций.

#define MAX_ARRAY_LENGTH 20

Эта директива говорит CPP, чтобы заменить все MAX_ARRAY_LENGTH 20. Использование#defineдля определения констант для повышения читаемости.

#include <stdio.h>
#include "myheader.h"

Эти инструкции сказать CPP stdio.h получить изсистемной библиотеки, а также добавить текст к текущему исходному файлу.Следующая строка говорит CPPmyheader.h получить из локального каталога и добавить содержимое в текущем исходном файле.

#undef  FILE_SIZE
#define FILE_SIZE 42

Эта команда сообщает CPP отменить FILE_SIZE определены, и определить его как 42.

#ifndef MESSAGE
   #define MESSAGE "You wish!"
#endif

Эта команда сообщает CPP только тогда, когда ПОСЛАНИЕ неопределенными только тогда, когда определено СООБЩЕНИЕ.

#ifdef DEBUG
   /* Your debugging statements here */
#endif

Эта команда говорит CPP, если вы определили DEBUG, затем выполняет оператор обработки. Во время компиляции, если вы передаете переключатель-DDEBUGв GCC компилятор, эта команда полезна. Она определяет DEBUG, вы всегда можете включить или отключить отладку во время компиляции.

Предварительно определенные макросы

ANSI C определяет количество макросов. В программировании, вы можете использовать эти макросы, но разные непосредственно изменять эти предопределенные макросы.

描述
__DATE__当前日期,一个以 "MMM DD YYYY" 格式表示的字符常量。
__TIME__当前时间,一个以 "HH:MM:SS" 格式表示的字符常量。
__FILE__这会包含当前文件名,一个字符串常量。
__LINE__这会包含当前行号,一个十进制常量。
__STDC__当编译器以 ANSI 标准编译时,则定义为 1。

Давайте попробуем следующие примеры:

#include <stdio.h>

main()
{
   printf("File :%s\n", __FILE__ );
   printf("Date :%s\n", __DATE__ );
   printf("Time :%s\n", __TIME__ );
   printf("Line :%d\n", __LINE__ );
   printf("ANSI :%d\n", __STDC__ );

}

Когда приведенный выше код (в файлеtest.c) составляются и выполняются, он дает следующие результаты:

File :test.c
Date :Jun 2 2012
Time :03:36:24
Line :8
ANSI :1

оператор Препроцессор

C препроцессор предоставляет следующие операторы, чтобы помочь вам создать макрос:

Продолжение макро-оператора (\)

Макрос обычно записывается в одной строке. Тем не менее, если макрос слишком длинный, чтобы поместиться в одной строке, используйте продолжение макро оператора (\). Например:

#define  message_for(a, b)  \
    printf(#a " and " #b ": We love you!\n")

Оператор Строковые литералы квантования (#)

В определениях макросов, когда вам нужно поместить макрос аргумент в строку постоянной, то строка постоянный оператор квантования (#). Macro с помощью оператора имеет определенный параметр или параметр списка. Например:

#include <stdio.h>

#define  message_for(a, b)  \
    printf(#a " and " #b ": We love you!\n")

int main(void)
{
   message_for(Carole, Debra);
   return 0;
}

Когда приведенный выше код компилируется и выполняется, он дает следующие результаты:

Carole and Debra: We love you!
Токен оператор приклеивание (##)

Токен оператор приклеивание (##) в определение макроса будет объединить эти два параметра. Это позволяет использовать два независимых теги макроопределении объединяются в тег. Например:

#include <stdio.h>

#define tokenpaster(n) printf ("token" #n " = %d", token##n)

int main(void)
{
   int token34 = 40;
   
   tokenpaster(34);
   return 0;
}

Когда приведенный выше код компилируется и выполняется, он дает следующие результаты:

token34 = 40

Вот как это произошло, потому что этот пример будет производить следующий фактический выход из компилятора:

printf ("token34 = %d", token34);

Этот пример демонстрирует маркер ## п подключается к token34 здесь, мы использовалипостоянный оператор строки квантования (#), и лексемы оператора приклеивание (##).

определен () оператор

Определяется оператор препроцессора используется в постоянном выражении , используемом для определения идентификатора был определен ли с помощью #define.Если указанный идентификатор уже определен, значение истинно (не равно нулю). Если заданный идентификатор не определен, значение ложно (ноль). Следующий пример иллюстрирует определенный () использование оператора:

#include <stdio.h>

#if !defined (MESSAGE)
   #define MESSAGE "You wish!"
#endif

int main(void)
{
   printf("Here is the message: %s\n", MESSAGE);  
   return 0;
}

Когда приведенный выше код компилируется и выполняется, он дает следующие результаты:

Here is the message: You wish!

Параметризованная макро

CPP является мощным средством может быть использовано для имитации параметризированный функцию макросъемки. Например, следующий код, чтобы вычислить квадрат числа:

int square(int x) {
   return x * x;
}

Мы можем использовать макрос, чтобы переписать приведенный выше код следующим образом:

#define square(x) ((x) * (x))

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

#include <stdio.h>

#define MAX(x,y) ((x) > (y) ? (x) : (y))

int main(void)
{
   printf("Max between 20 and 10 is %d\n", MAX(10, 20));  
   return 0;
}

Когда приведенный выше код компилируется и выполняется, он дает следующие результаты:

Max between 20 and 10 is 20