CC++Qt « Описание структур и функций с помощью директивы #define
Доброго времени суток. Перешел с java на Си. Гуглил по этому вопросу, но везде одни и те же примеры. Хотелось бы более детального разъяснения вопроса.
Директива #define определяет макроподстановку. Интересует же меня, можно ли при макроподстановке описать функцию (#define <имя> <функция>) и ссылку на массив структур. (Два разных #define)
Хотелось бы пример кода с комментариями. Заранее спасибо.
Директива #define определяет макроподстановку. Интересует же меня, можно ли при макроподстановке описать функцию (#define <имя> <функция>) и ссылку на массив структур. (Два разных #define)
Хотелось бы пример кода с комментариями. Заранее спасибо.
1 ответов
#define имеет 3 назначения.
1. Указывает, что такое имя есть. Например:
#define FOR_DEBUG_ONLY
и далее в тексте
#if defined( FOR_DEBUG_ONLY )
printf( "x = %d\n", x );
#endif
теперь если закомментировать строку с определением FOR_DEBUG_ONLY, то вышеприведённый код работать не будет ( даже не будет компилироваться )
2. Обычная замена одного симола - другим ( примерно также, как ты заменяешь в редакторе Edit/Replace ). Например:
#define M_PI 3.1415926537
for ( int i = 0; i < N; i++ )
y[ i ] = cos( i / (double)N * 2 * M_PI );
У данного применения есть один момент: препроцессор ТУПО заменяет одно другим, поэтому, если описать такое
#define FOUR 2 + 2
int y = FOUR * 3;
то получится: y = 2 + 2 * 3; т.е. 8, а не 12. Чтобы избежать этого выражения в define берут в скобки
#define FOUR ( 2 + 2 )
3. Макрос. Это почти то же самое, что п.2, только с параметрами. Например:
#define SQR( x ) ( x * x )
int y = SQR( 5 ); // 25
или так
#define MY_ALLOC( n ) malloc( n )
int * p = MY_ALLOC( 1024 );