使用if语句编译时间配置

时间:2017-03-31 19:21:18

标签: c gcc embedded

在嵌入式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]

是否有更好的方法可以避免此警告?

2 个答案:

答案 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的概念。预处理器的目的是在将源代码提供给编译器之前对其进行操作。由于您还没有使用任何预处理器条件,因此无论您的编译时条件如何,所有源代码都会被提供给编译器。您绝对应该使用预处理器条件来减少二进制文件。