2014-11-29 4 views
0

Я понимаю основы для директив препроцессора #if #endif в C, в зависимости от того, какое выражение оценивается как истина, код завершения внутри #if будет скомпилирован, м в настоящее время обучение Portaudio (я делаю приложение VOIP для школы) и я глядя на некоторые из их примеров, и я запутаться на малом участке#if #endif preprocessing Directive, PortAudio

/* Select sample format. */ 
#if 1 
#define PA_SAMPLE_TYPE paFloat32 
typedef float SAMPLE; 
#define SAMPLE_SILENCE (0.0f) 
#define PRINTF_S_FORMAT "%.8f" 
#elif 1 
#define PA_SAMPLE_TYPE paInt16 
typedef short SAMPLE; 
#define SAMPLE_SILENCE (0) 
#define PRINTF_S_FORMAT "%d" 
#elif 0 
#define PA_SAMPLE_TYPE paInt8 
typedef char SAMPLE; 
#define SAMPLE_SILENCE (0) 
#define PRINTF_S_FORMAT "%d" 
#else 
#define PA_SAMPLE_TYPE paUInt8 
typedef unsigned char SAMPLE; 
#define SAMPLE_SILENCE (128) 
#define PRINTF_S_FORMAT "%d" 
#endif 

первый вопрос, который приходит на ум

#if 1 
#define PA_SAMPLE_TYPE paFloat32 
typedef float SAMPLE; 
#define SAMPLE_SILENCE (0.0f) 
#define PRINTF_S_FORMAT "%.8f" 
#elif 1 
#define PA_SAMPLE_TYPE paInt16 
typedef short SAMPLE; 
#define SAMPLE_SILENCE (0) 
#define PRINTF_S_FORMAT "%d" 

wont the #elif 1 всегда пропускается причина, если каким-то образом #if 1 (#if true) оценивается как false, wont #elif 1 также вычисляется как false?

вопрос 2 не 1 оценить true и 0 на false? поэтому wont #elif 0 всегда оценивается как false? то есть это не имеет большого значения?

вопрос 3 Я буду посылать эти образцы через сокет, пропускает эту директиву препроцессора и просто работать с кодом

#define PA_SAMPLE_TYPE paInt8 
typedef char SAMPLE; 
#define SAMPLE_SILENCE (0) 
#define PRINTF_S_FORMAT "%d" 

или

#define PA_SAMPLE_TYPE paUInt8 
typedef unsigned char SAMPLE; 
#define SAMPLE_SILENCE (128) 
#define PRINTF_S_FORMAT "%d" 
#endif 

Будет ли это Бетер так как мой SAMPLE_TYPE/SAMPLE можно рассматривать как массив символов/Unsigned Characters (без необходимости конвертировать поплавки в символы, а затем обратно) для записи/чтения из сокета?

ответ

1

То, что вы должны понять, между последовательностью #if/#elif/#else, будет выбран только одно условие:

#if выбран здесь:

#if 1 
// only this one will be selected 
#elif 1 
#else 
#endif 

#elif выбран здесь :

#if 0 
#elif 1 
// only this one will be selected 
#else 
#endif 

#else выбран здесь:

#if 0 
#elif 0 
#else 
// only this one will be selected 
#endif 
+0

Я получил эту часть, я предположил, что она работает как инструкция if в java/c/C++ и т. Д. Что мне интересно, обычно #if 1 всегда оценивается/скомпилируется, поскольку это по существу #if true? то остальные из них выбрасываются? –

+1

Конечно, это всегда будет оценено, программист, вероятно, сделал это так, чтобы он мог изменить эти константы, чтобы выбрать разные условия. – ouah

+0

У меня есть то, о чем я думал, #elif 1 просто заставило меня задаться вопросом, почему на земле было бы 2 единицы, и я сделал это более сложным, что это действительно должно было быть Спасибо! последний вопрос Я работаю с сокетами, должен ли я использовать типы данных Char/Unsigned Char (PortAudio не уверен, если вы знакомы, выделите память, скажем, 2048 (размер моего пакета) байтов на некоторый указатель SAMPLE, а затем с этими данными указатель Я собираюсь отправить его через сокет) –

Смежные вопросы