在C中的新#define中使用先前定义的#define

Oil*_*oud 5 c c-preprocessor

在做某些事情时是否存在任何潜在的问题/危险

#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),并且所有其他值都设置为他们需要的值而没有其他更改.我不完全确定这是最佳做法还是安全.

Chr*_*odd 7

宏不会在#define声明中扩展.如果您#define喜欢:

#define ONE_MINUTE ( SAMPLERATE * 60 )
Run Code Online (Sandbox Code Playgroud)

这定义了宏ONE_MINUTE的扩展(主体)( SAMPLERATE * 60 ).是否有一个SAMPLERATE在程序中其他位置定义的宏是完全无关紧要的.这种宏的存在(或不存在)没有效果.

相反,当宏使用(并且宏扩展)时,将重新扫描该扩展的结果,以便扩展其他宏.所有重要的是,是否SAMPLERATE定义在使用的点ONE_MINUTE.


bbl*_*coe 6

A #define由预处理器处理.预处理器在编译之前运行,可以执行简单的数学运算和代码的复制/粘贴.例如,您可以使用您的示例执行以下操作:

int myVar = SAMPLERATE;

预处理器只需在编译之前粘贴到32哪里SAMPLERATE.

从现在为整数值创建名称的意义上讲,此机制非常强大.这为您和未来的开发人员增加了意义.它还允许您在一个地方而不是许多地方进行更改.

请确保#define SAMPLERATE 32在任何其他#define可能使用的陈述之前SAMPLERATE.

  • @bblincoe:不 - 这不是真的 - 预处理器只是进行文本替换.但是,编译器通常会将任何编译时常量表达式减少为单个值. (2认同)