在做某些事情时是否存在任何潜在的问题/危险
#define SAMPLERATE 32 // Sample rate in hertz
#define ONE_MINUTE ( SAMPLERATE * 60 )
#define FIVE_MINUTES ( ONE_MINUTE * 5 )
Run Code Online (Sandbox Code Playgroud)
我的编译器不会发出任何错误或警告.这非常好,因为我可以更改一个#define值(SAMPLERATE),并且所有其他值都设置为他们需要的值而没有其他更改.我不完全确定这是最佳做法还是安全.
宏不会在#define声明中扩展.如果您#define喜欢:
#define ONE_MINUTE ( SAMPLERATE * 60 )
Run Code Online (Sandbox Code Playgroud)
这定义了宏ONE_MINUTE的扩展(主体)( SAMPLERATE * 60 ).是否有一个SAMPLERATE在程序中其他位置定义的宏是完全无关紧要的.这种宏的存在(或不存在)没有效果.
相反,当宏使用(并且宏扩展)时,将重新扫描该扩展的结果,以便扩展其他宏.所有重要的是,是否SAMPLERATE定义在使用的点ONE_MINUTE.
A #define由预处理器处理.预处理器在编译之前运行,可以执行简单的数学运算和代码的复制/粘贴.例如,您可以使用您的示例执行以下操作:
int myVar = SAMPLERATE;
预处理器只需在编译之前粘贴到32哪里SAMPLERATE.
从现在为整数值创建名称的意义上讲,此机制非常强大.这为您和未来的开发人员增加了意义.它还允许您在一个地方而不是许多地方进行更改.
请确保#define SAMPLERATE 32在任何其他#define可能使用的陈述之前SAMPLERATE.