Значение #undef в C ++ - PullRequest
3 голосов
/ 08 июля 2010

Я знаю, что это значит

#define M(B) (1U << ((sizeof(x) * CHAR_BIT) - B)) // CHAR_BIT=bits/byte

, но я не очень хорошо понимаю этот:

#undef M 

после того, что происходит?М очищается или удаляется или?

Ответы [ 3 ]

14 голосов
/ 08 июля 2010

После #undef создается впечатление, что линия #define M... никогда не существовала.

int a = M(123); // error, M is undefined

#define M(B) (1U << ((sizeof(x) * CHAR_BIT) - B))

int b = M(123); // no error, M is defined

#undef M

int c = M(123); // error, M is undefined
2 голосов
/ 08 июля 2010

Вот статья MSDN об этом: http://msdn.microsoft.com/en-us/library/ts4w8783(VS.80).aspx

Насколько я понимаю, он удаляет определение M, чтобы его можно было использовать для определения чего-то другого.

EG

#define M(X) 2*(X)
int a = M(2); 
ASSERT(a == 4);
#undefine M
#define M(X) 3*(X)
int b = M(2);
ASSERT(b == 6);

Это может показаться запутанным, но может пригодиться на практике, если вам нужно работать с чужими макросами.

1 голос
/ 08 июля 2010

# define и #undef - директивы препроцессора.

Например, #define M (X) 2 * (X)

M (1);

# undef M

M (2)

Поскольку директивы препроцессора перед компиляцией, препроцессор просто заменит после #define M (X) 2 * (X) в этом исходном файле.

M (1) с 2 * 1

, если препроцессор находит #undef M, он больше не заменит

M (2) на 2 * 2, потому что M уничтожается при#undef M найдено.

# undef обычно используется, если вы хотите дать другое определение для существующего макроса

...