Оператор ##
Оператор "##" служит для соединения двух параметров макрокоманды в одну последовательность символов. Такая макрокоманда должна иметь следующий вид:
#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).
