【发布时间】:2016-03-25 15:15:46
【问题描述】:
有没有更好的方法(在 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 的重复。
该问题(和答案)没有解决如何在不以两个相似符号结尾的情况下获得可打印字符串。
(我在发布这个问题之前确实看过那个答案。)
【问题讨论】:
-
您的第二个建议还不错。当然,您不应该为您定义的每件事重复
#if块,而是一起定义所有内容。此方法还允许您控制有效值,并允许您在未指定硬件时在#else子句中发出#error。 (在#ifs 中,未知宏的值为零。) -
@JosephQuinsey 这个问题没有解决如何获取可打印字符串。
-
要获得可打印的字符串,请参阅 Jens Gustedt 的回答 Way to compare strings in C preprocessor? (GCC)。
标签: c gcc c-preprocessor