18 Препроцессорные операции. Прагмы.

Если макроопределение имеет формальные параметры, то над формальными параметрами в тексте_подстановки могут быть произведены следующие препроцессорные операции:

1)# преобразование строки

2)## преобразование лексем

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

Пр.   #define Message(x) Message Box(#x “сообщение”);

Message (хорошее)

    

Message Box (хорошее сообщение)

Операция ## позволяет объединить две лексемы в одну, поэтому знак операции не может задаваться перед первой лексемой и после последней.

Если формальному параметру в макроопределении предшествует ## или следует за ним, то он сначала заменяется фактическим аргументом. Если аргумент содержит макрокоманду, то она не обрабатывается. Затем лексемы сцепляются, а сам знак ## удаляется из текста программы. Результирующая лексема должна быть правильной.

Если получившаяся лексема является именем макроопределения, то выполняется обработка макрокоманды.

Пр.    #define debug(x) printf(“VAR” #x”=%d”, VAR ##x)

debug (3)

  

printf(VAR3=%d”, VAR 3);

Прагмы (специальные директивы).

# pragma    последовательность символов

Пр.   #pragma auto_inline([on|off])

#pragma check_stack([on|off])

проверка на переполнение стека

#pragma Data_seg (“имя”,”атрибут”)

#pragma message (“сообщение”)

Пр.   #if  _M_IX86==500

#pragma message (“Pentium processor”)

#endif

ПР    #pragma once

f1.h                                                    

#define f2.h                                        

#if !#defined(f2.h)                               

#include “F2.h”                                  

#endif                                                 

f2.h

#define f1.h

#if !#defined(f1.h)

#include “F1.h”

#endif

 

#pragma warning9disable:4507, once 4385, error:164)

Hosted by uCoz