我了解C语言中的#if #endif预处理程序指令的基础,因为根据哪个表达式的计算结果为真,将编译#if中的后续代码,但是我目前正在学习portaudio(我正在制作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不等于true,0不等于false?所以#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可以被视为用于从套接字写入/读取的字符/无符号字符数组(不必将浮点数转换为chars,然后再次返回)吗?

最佳答案

您需要理解的是在#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

关于c - #if#endif预处理指令,PortAudio,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27197414/

10-12 02:56