在嵌入式C世界中,我们经常将配置详细信息存储在标头中,以便可以为特定任务构建库,从而最大限度地减少开销和编译大小。
一个例子是:
//libnameConf.h
#define LIBNAME_WAVE LIBNAME_A
typedef enum {
LIBNAME_A,
LIBNAME_B,
LIBNAME_C
} libname_wave_t;
//libname.c
double coef_arr_a[100] = {...};
double coef_arr_b[100] = {...};
double coef_arr_c[100] = {...};
if (LIBNAME_WAVE == LIBNAME_A) {
somestruct.waveCoefs = coef_arr_a;
//do other coef_arr_a specific stuff
} else if (LIBNAME_WAVE == LIBNAME_B) {...}
对于这个特殊情况,我们使用if语句,编译器显然会崩溃这是一件好事,因为我们只想要一个coef_arr_a的引用,以便其他的不会被编译成二进制文件并占用空间
不幸的是,这会产生警告
warning: comparison between 'enum <anonymous>' and 'enum <anonymous>' [-Wenum-compare]
是否有更好的方法可以避免此警告?
答案 0 :(得分:1)
如何仅使用宏而不是使用变量和枚举。
//libnameConf.h
#define LIBNAME_A
// #define LIBNAME_B // Uncomment this line and both comment the above line while changing libs.
然后我们使用这样的几个条件编译语句。
//libname.c
double coef_arr_a[100] = {...};
double coef_arr_b[100] = {...};
#ifdef LIBNAME_A
somestruct.waveCoefs = coef_arr_a;
//do other coef_arr_a specific stuff
#endif
#ifdef LIBNAME_B
somestruct.waveCoefs = coef_arr_b;
#endif
答案 1 :(得分:0)
听起来你在C中需要conditional compilaiton但是你做的方式不正确。条件编译是在编译器之前运行的preprocessor的概念。预处理器的目的是在将源代码提供给编译器之前对其进行操作。由于您还没有使用任何预处理器条件,因此无论您的编译时条件如何,所有源代码都会被提供给编译器。您绝对应该使用预处理器条件来减少二进制文件。