#if #endif预处理指令,PortAudio

时间:2014-11-29 00:02:41

标签: c sockets portaudio preprocessor-directive

我理解C中#if #endif预处理程序指令的基础知识,因为根据哪个表达式求值为true,#if中的进程代码将被编译,但我目前正在学习portaudio(I& #39;为学校制作VOIP应用程序)我正在查看他们的一些例子,我对一小部分感到困惑

/* 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"

不会总是跳过#elif 1,因为如果某种方式#if 1(#if true)的计算结果为false,那么#elif 1也会评估为false吗?

问题2 是不是1评估为真,0为假?所以#elif 0总是评价为假?即它真的不重要吗?

问题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可以被视为一个字符数组/无符号字符(不必将浮点数转换为字符然后再返回)以便从套接字写入/读取?

1 个答案:

答案 0 :(得分: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