Why only define a macro if it's not already defined?
在我们的C代码库中,我看到每个宏都按以下方式定义:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #ifndef BEEPTRIM_PITCH_RATE_DEGPS #define BEEPTRIM_PITCH_RATE_DEGPS 0.2f #endif #ifndef BEEPTRIM_ROLL_RATE_DEGPS #define BEEPTRIM_ROLL_RATE_DEGPS 0.2f #endif #ifndef FORCETRIMRELEASE_HOLD_TIME_MS #define FORCETRIMRELEASE_HOLD_TIME_MS 1000.0f #endif #ifndef TRIMSYSTEM_SHEARPIN_BREAKINGFORCE_LBS #define TRIMSYSTEM_SHEARPIN_BREAKINGFORCE_LBS 50.0f #endif |
这些定义检查的理由是什么,而不仅仅是定义宏?
1 2 3 4 | #define BEEPTRIM_PITCH_RATE_DEGPS 0.2f #define BEEPTRIM_ROLL_RATE_DEGPS 0.2f #define FORCETRIMRELEASE_HOLD_TIME_MS 1000.0f #define TRIMSYSTEM_SHEARPIN_BREAKINGFORCE_LBS 50.0f |
我无法在网络上的任何地方找到这种做法。
这允许您在编译时覆盖宏:
1 | gcc -DMACRONAME=value |
头文件中的定义用作默认值。
正如我在评论中所说,想象一下这种情况:
foo.h中
1 | #define FOO 4 |
的defs.h
1 2 3 4 5 6 7 | #ifndef FOO #define FOO 6 #endif #ifndef BAR #define BAR 4 #endif |
bar.c
1 2 3 4 5 6 7 8 9 10 | #include"foo.h" #include"defs.h" #include <stdio.h> int main(void) { printf("%d%d", FOO, BAR); return 0; } |
将打印
但是,如果条件
1 2 3 4 5 6 7 8 9 | $ gcc -o bar bar.c In file included from bar.c:2:0: defs.h:1:0: warning:"FOO" redefined [enabled by default] #define FOO 6 ^ In file included from bar.c:1:0: foo.h:1:0: note: this is the location of the previous definition #define FOO 4 ^ |
我不知道上下文,但这可以用来为用户提供覆盖这些宏定义设置的值的可用性。如果用户明确为这些宏中的任何一个定义了不同的值,则将使用它而不是此处使用的值。
例如,在g ++中,您可以在编译期间使用
这样做是为了使头文件的用户可以覆盖他/她的代码或编译器的-D标志中的定义。
任何C项目都驻留在多个源文件中。当处理单个源文件时,检查似乎(并且实际上)没有意义,但是在处理大型C项目时,最好在定义常量之前检查现有定义。这个想法很简单:你需要特定源文件中的常量,但它可能已经在另一个中定义了。
您可以考虑一个框架/库,它为用户提供一个默认预设,允许用户编译和处理它。
这些定义在不同的文件中传播,建议最终用户包含它的config.h文件,在那里他可以配置它的值。
如果用户忘记了一些定义,系统可以因预设而继续工作。
运用
1 2 3 | #ifndef BEEPTRIM_PITCH_RATE_DEGPS #define BEEPTRIM_PITCH_RATE_DEGPS 0.2f #endif |
允许用户使用命令行参数(在gcc / clang / VS中)
还有另一个重要原因。以不同方式重新定义预处理器宏是错误的。看到另一个SO问题的答案。如果没有