CC++Qt « Описание структур и функций с помощью директивы #define

Доброго времени суток. Перешел с java на Си. Гуглил по этому вопросу, но везде одни и те же примеры. Хотелось бы более детального разъяснения вопроса.

Директива #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 );