在 C 预处理器中比较字符串的方法? (海湾合作委员会)
Way to compare strings in C preprocessor? (GCC)
是否有更好的方法(在 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 的重复。
该问题(和答案)并未解决如何在不以两个相似符号结尾的情况下获取可打印字符串。
(我在发布这个问题之前确实看过那个答案。)
通常的做法是定义所需的配置符号,然后有条件地定义所有其他的:
// 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
要进行实际案例分析,请查看将其标记为重复的评论。要实际上也将值作为字符串,您可以使用字符串化,例如
#define STRINGIFY(...) #__VA_ARGS__
#define HARDWARE_STR STRINGIFY(HARDWARE)
一种完全不同的方法是将依赖于字符串的逻辑移动到 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
是否有更好的方法(在 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 的重复。
该问题(和答案)并未解决如何在不以两个相似符号结尾的情况下获取可打印字符串。
(我在发布这个问题之前确实看过那个答案。)
通常的做法是定义所需的配置符号,然后有条件地定义所有其他的:
// 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
要进行实际案例分析,请查看将其标记为重复的评论。要实际上也将值作为字符串,您可以使用字符串化,例如
#define STRINGIFY(...) #__VA_ARGS__
#define HARDWARE_STR STRINGIFY(HARDWARE)
一种完全不同的方法是将依赖于字符串的逻辑移动到 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