是否有相当于 awk sprintf 的工具用于 C 编译器 #define 指令

问题描述 投票:0回答:1

对于上下文,我希望更加“包容”,而不仅仅是仅限于逐项列出该类型的所有实例

#define SPANISH 'es_MX:es'
#define FRENCH  'fr_CA:fr'
#define ENGLISH 'en_CA:en'

在 awk 中,我可以做

MYLANG = sprintf("%2s", LANG)

我想做那么简单的事情,所以我可以做

//awk syntax for sprintf
#define   MYLANG   {simple}     

仅获取字符串 LANG 的前 2 个字符。

有什么我可以用的吗?

c c-preprocessor
1个回答
0
投票

在 C 中,没有与 #define 指令中使用的 sprintf 函数直接等效的函数,因为 #define 指令是预处理器指令,并且不具备执行格式化字符串等运行时操作的能力。

但是,您可以通过使用预处理器字符串连接手动定义具有 LANG 前两个字符的字符串来实现您的目标。以下是如何做到这一点的示例:

#define SPANISH LANG[0] == 'e' && LANG[1] == 's' ? "es_MX:es" : ""
#define FRENCH  LANG[0] == 'f' && LANG[1] == 'r' ? "fr_CA:fr" : ""
#define ENGLISH LANG[0] == 'e' && LANG[1] == 'n' ? "en_CA:en" : ""

LANG[0]和LANG[1]用于访问LANG字符串的前两个字符。三元条件运算符 ? : 用于检查前两个字符是否与所需的语言代码匹配,如果匹配,则定义相应的字符串,否则定义空字符串。这样,您就可以根据 LANG 的前两个字符获得您想要的行为。

以下是如何使用它...

const char* LANG = "es_MX:es";

int main() {
    printf("%s\n", SPANISH);
    printf("%s\n", FRENCH);
    printf("%s\n", ENGLISH);
    return 0;
}

代码应该输出

© www.soinside.com 2019 - 2024. All rights reserved.