比较C预处理器中的字符串的方法? (GCC)

时间:2015-12-18 20:41:42

标签: c gcc c-preprocessor

有没有更好的方法(在GCC C中)?

我正在尝试定义一些代表硬件平台的符号,用于条件编译。

但我也想要描述硬件的可打印字符串(用于诊断)。

理想情况下,我希望能够做到:

#define HARDWARE "REV4C"

#if (HARDWARE == "REV4C")
    #define LED_RED      // define pin addresses, blah blah...
#endif

printf("HARDWARE %s\n", HARDWARE);

但我不认为这是允许的C.这有效,但它很难看:

#define REV4C   (403)    // symbols for conditional compilation
#define REV421  (421) 

//#define HARDWARE REV4C // choose hardware platform (just one)
#define HARDWARE REV421

#if (HARDWARE == REV421) // define strings for printing
    #define HARDWARE_ID "REV421"
#elif (HARDWARE == REV4C)
    #define HARDWARE_ID "REV4C"
#else
    #define HARDWARE_ID "unknown"
#endif

#if (HARDWARE == REV421)
    #define LED_RED      // define pin addresses, blah blah...
#endif

/* ... */

printf("HARDWARE_ID %s\n", HARDWARE_ID);

这很难看,因为它需要两个单独的符号HARDWARE(一个整数,用于比较)和HARDWARE_ID(一个字符串,用于打印)。以及生成HARDWARE_ID

值的逻辑

有更好的方法吗?

编辑:我认为这不是how to compare string in C conditional preprocessor-directives的副本。

这个问题(和答案)没有解决如何获得可打印的字符串而不会得到两个相似的符号。

(在发布此问题之前,我确实看过那个答案。)

3 个答案:

答案 0 :(得分:4)

通常的做法是定义所需的配置符号,然后有条件地定义所有其他符号:

// Select config here
#define REV4C
//#define REV421

#ifdef REV4C
    #define HARDWARE_ID "REV4C"
    #define LED_RED
#elif defined(REV421)
    #define HARDWARE_ID "REV421"
    // .....
#else
//.......
#endif

答案 1 :(得分:1)

要进行实际案例分析,请查看将此标记为重复的注释。要实际上也将值作为字符串,您可以使用字符串化,例如

#define STRINGIFY(...) #__VA_ARGS__
#define HARDWARE_STR STRINGIFY(HARDWARE)

答案 2 :(得分:1)

一种完全不同的方法是将依赖于字符串的逻辑移动到 build

C预处理器非常有限,但make(以及规则中的shell命令)是完全灵活的字符串处理器。例如。使用GNU make

ifeq ($(CONFIG),REV4C)
    HARDWARE_ID = \"REV4C\"
else
    HARDWARE_ID = \"DEFAULT\"
endif
CFLAGS += -DHARDWARE_ID=$(HARDWARE_ID)

并致电

gmake CONFIG=REV4C