我了解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/