Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lesson5.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
83.97 Кб
Скачать

Оператор ##

Оператор "##" служит для соединения двух параметров макрокоманды в одну последовательность символов. Такая макрокоманда должна иметь следующий вид:

#define <имя>(<список_параметров>) <шаблон>

Здесь шаблон — это последовательность лексем, содержащая два параметра макрокоманды, которые соединены символами ##. Например, определим макрокоманду:

#define var(type, s, var) type##s var

Используя эту макрокоманду, можно определить указатель на целочисленную переменную:

var(int, *, n);

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

Определение макрокоманды

Для того чтобы, макрокоманда, определенная программистом, была доступна во всех файлах проекта, можно определить её в одном из заголовочных файлов, и все остальные файлы проекта должны подключить его с помощью директивы include. Но такой способ не является гибким, при добавлении нового файла в проект подключение заголовочного файла является необходимым условием (а об этом программист может забыть). Поэтому в таких в случаях добавляют макрокоманду в опции компилятора. В зависимости от среды/компилятора добавление может отличаться.

Примечание: в Microsoft Visual Studio необходимо открыть свойства проекта (Properties) и в поле определения препроцессора (Preprocessor Definitions) добавить запись следующего вида:

<имя>[=<константа>]

В среде разработки Qt Creator также с свойствах проекта в поле дополнительных параметрах сборки, сделать следующую запись:

DEFINES+=<имя>[=<константа>]

ВАРИАТИВНЫЙ МАКРОС

Синтаксис объявления схож с синтаксисом вариативной функции: пропуск «...» используется для обозначения того, что нуль или более аргументов могут быть переданы. При расширении макросом каждый вызов специального идентификатора __VA_ARGS__ в списке замещения макроса заменяется переданными аргументами.

void realdprintf (char const *file, int line, char const *fmt, ...);

#define dprintf(...) realdprintf(__FILE__, __LINE__, __VA_ARGS__)

ВЕРСИИ ЯЗЫКА ПРОГРАММИРОВАНИЯ С

C — стандартизированный процедурный язык программирования. Язык C был разработан в начале 1970-х годов сотрудниками Bell Labs Кеном Томпсоном и Денисом Ритчи.

C был создан для использования в операционной системе UNIX, в том числе и для написания ядра системы. С тех пор он был портирован на многие другие операционные системы и стал одним из самых широко используемых языков программирования.

В 1978 году была опубликована книга “Язык программирования C” Ритчи и Кернигана, описанный в ней язык стал неформальным стандартом языка, известным как K&R C.

Первый официальный стандарт языка был создан в 1989 году ANSI X3.159-1989 и в следующем году с незначительными изменениями принят как ISO/IEC 9899:1990; он известен как ANSI C (C89 и С90). Следующими стандартами стали ISO 9899:1999 (C99) и ISO/IEC 9899:2011 (C11).

Более подробную информацию о версиях языка программирования С можно узнать из справочников.

Приведем код программы, которая выводит версию компиляторы языка C:

#include <stdio.h>

int main(void)

{

char *version = "unknown";

#ifdef __STDC__

printf("__STDC__ = %d\n", __STDC__);

#endif

#ifdef __STDC_VERSION__

printf("__STDC_VERSION__ = %ld\n", __STDC_VERSION__);

#endif

printf("\n\n");

#if (defined __STDC__) && (__STDC__ == 1)

#if (defined __STDC_VERSION__)

#if (__STDC_VERSION__ >= 201112L)

version = "C11";

#elif (__STDC_VERSION__ >= 199901L)

version = "C99";

#elif (__STDC_VERSION__ >= 199409L)

version = "C94";

#endif

#else

version = "C90 or C89";

#endif

#endif

printf("Standart C: %s\n", version);

return 0;

}

Примечание: Следует сказать, что некоторые компиляторы поддерживают переключение между версиями. В зависимости от среда разработки и/или версии ком смена версии происходит по разному. Например в Qt Creator в файл проекта (*.pro) необходимо добавить опцию QMAKE_CFLAGS += -std=c99 (или с89, с90, с11).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]