C(C11以上):
第一种方式:
/**
* @file duLangMap.h
* @author geovindu,Geovin Du([email protected])
* @brief vscode c11
* @version 0.1
* @date 2023-12-18
*
* @copyright Copyright (c) 站在巨人的肩膀上 Standing on the Shoulders of Giants 2023
*
*/
#ifndef DULANGMAP_H
#define DULANGMAP_H
#define ChinseLangsList \
DUX(afdu) \
DUX(aldu) \
DUX(ardu) \
DUX(azdu) \
DUX(bgdu) \
DUX(cadu) \
DUX(czdu) \
DUX(dadu) \
DUX(dedu) \
DUX(eldu) \
DUX(endu) \
DUX(eudu) \
DUX(fadu) \
DUX(fidu) \
DUX(frdu) \
DUX(gldu) \
DUX(hedu) \
DUX(hidu) \
DUX(hrdu) \
DUX(hudu) \
DUX(iddu) \
DUX(itdu) \
DUX(jadu) \
DUX(krdu) \
DUX(ladu) \
DUX(ltdu) \
DUX(mkdu) \
DUX(nodu) \
DUX(nldu) \
DUX(pldu) \
DUX(ptdu) \
DUX(pt_brdu) \
DUX(rodu) \
DUX(rudu) \
DUX(svdu) \
DUX(sedu) \
DUX(skdu) \
DUX(sldu) \
DUX(spdu) \
DUX(esdu) \
DUX(srdu) \
DUX(thdu) \
DUX(trdu) \
DUX(uadu) \
DUX(ukdu) \
DUX(vidu) \
DUX(zh_cndu) \
DUX(zh_twdu) \
DUX(zudu)
typedef enum
{
#define DUX(name) name,
ChinseLangsList
#undef DUX
Chinse_Count
} numbers_t;
/**
* @brief
*
*/
static const char* LangDuToString[Chinse_Count] =
{
#define DUX(name) [name] = #name,
ChinseLangsList
#undef DUX
};
#endif
第二种试:
/**
* @file LanguageList.h
* @author geovindu,Geovin Du,涂聚文 ([email protected])
* @brief
* IDE: vscode c11
* @version 0.1
* @date 2023-12-18
*
* @copyright Copyright (c) 站在巨人的肩膀上 Standing on the Shoulders of Giants 2023
*
*/
#ifndef LANGUAGELIST_H
#define LANGUAGELIST_H
#define EnumLangTypeCase(x) case x: return(#x);
/**
* @brief 语种类型
*
*/
enum DuLang
{
af= 0,// Afrikaans
al=1 ,// Albanian
ar=2 ,// Arabic
az=3 ,// Azerbaijani
bg=4 ,// Bulgarian
ca=5 ,// Catalan
cz=6 ,// Czech
da=7 ,// Danish
de=8 ,// German
el=9 ,// Greek
en=10 ,// English
eu=11 ,// Basque
fa=12 ,// Persian (Farsi)
fi=13,// Finnish
fr=14,// French
gl=15 ,// Galician
he=16 ,// Hebrew
hi=17,// Hindi
hr=18 ,// Croatian
hu=19,// Hungarian
id=20,// Indonesian
it=21,// Italian
ja=22 ,// Japanese
kr=23 ,// Korean
la=24,// Latvian
lt=25,// Lithuanian
mk=26 ,// Macedonian
no=27 ,// Norwegian
nl=28 ,// Dutch
pl=29,// Polish
pt=30,// Portuguese
pt_br=31,// Português Brasil
ro=32,// Romanian
ru=33,// Russian
sv=34 ,// se Swedish
se=35,
sk=36 ,// Slovak
sl=37 ,// Slovenian
sp=38 ,// es Spanish
es=39,
sr=40 ,// Serbian
th=41 ,// Thai
tr=42,// Turkish
ua=43,// uk Ukrainian
uk=44,
vi=45,// Vietnamese
zh_cn=46 ,// Chinese Simplified
zh_tw=47 ,// Chinese Traditional
zu=48 // Zulu
};
/**
* @brief
*
*/
static inline const char *LangtoString(enum DuLang type)
{
switch (type){
EnumLangTypeCase(af)// Afrikaans
EnumLangTypeCase(al)// Albanian
EnumLangTypeCase(ar)// Arabic
EnumLangTypeCase(az)// Azerbaijani
EnumLangTypeCase(bg)// Bulgarian
EnumLangTypeCase(ca)// Catalan
EnumLangTypeCase(cz)// Czech
EnumLangTypeCase(da)// Danish
EnumLangTypeCase(de)// German
EnumLangTypeCase(el)// Greek
EnumLangTypeCase(en)// English
EnumLangTypeCase(eu)// Basque
EnumLangTypeCase(fa)// Persian (Farsi)
EnumLangTypeCase(fi)// Finnish
EnumLangTypeCase(fr)// French
EnumLangTypeCase(gl)// Galician
EnumLangTypeCase(he)// Hebrew
EnumLangTypeCase(hi)// Hindi
EnumLangTypeCase(hr)// Croatian
EnumLangTypeCase(hu)// Hungarian
EnumLangTypeCase(id)// Indonesian
EnumLangTypeCase(it)// Italian
EnumLangTypeCase(ja)// Japanese
EnumLangTypeCase(kr)// Korean
EnumLangTypeCase(la)// Latvian
EnumLangTypeCase(lt)// Lithuanian
EnumLangTypeCase(mk)// Macedonian
EnumLangTypeCase(no)// Norwegian
EnumLangTypeCase(nl)// Dutch
EnumLangTypeCase(pl)// Polish
EnumLangTypeCase(pt)// Portuguese
EnumLangTypeCase(pt_br)// Português Brasil
EnumLangTypeCase(ro)// Romanian
EnumLangTypeCase(ru)// Russian
EnumLangTypeCase(sv)// se Swedish
EnumLangTypeCase(se)
EnumLangTypeCase(sk)// Slovak
EnumLangTypeCase(sl)// Slovenian
EnumLangTypeCase(sp)// es Spanish
EnumLangTypeCase(es)
EnumLangTypeCase(sr)// Serbian
EnumLangTypeCase(th)// Thai
EnumLangTypeCase(tr)// Turkish
EnumLangTypeCase(ua)// uk Ukrainian
EnumLangTypeCase(uk) //
EnumLangTypeCase(vi)// Vietnamese
EnumLangTypeCase(zh_cn)// Chinese Simplified
EnumLangTypeCase(zh_tw)// Chinese Traditional
EnumLangTypeCase(zu)// Zulu
}
return "nodata";
}
#endif
调用:
#include "include/duLangMap.h"
#include "include/LanguageList.h"
int main()
{
printf("hello world, c \n");
printf("你好,中国\n");
//简体中文 46
printf("%s\n",LangtoString(46));
printf("%s\n",LangtoString(zh_cn));
printf("%s\n",LangDuToString[2]);
printf("%s\n",LangDuToString[zh_cndu]);
return 0
}
输出:
C++(C++14以上):
第一种方式:
/*****************************************************************//**
* \file LanguageList.h
* \brief
* https://belaycpp.com/2021/08/24/best-ways-to-convert-an-enum-to-a-string/
* \ IDE vs 2022 C++ 20
* \author geovindu
* \date December 18 2023
* \copyright geovindu 站在巨人的肩膀上 Standing on the Shoulders of Giants
*********************************************************************/
#pragma once
#ifndef LANGUAGELIST_H
#define LANGUAGELIST_H
#include
/**
* \brief
*
*/
enum class Lang //:string .net 8
{
af,// Afrikaans
al,// Albanian
ar,// Arabic
az,// Azerbaijani
bg,// Bulgarian
ca,// Catalan
cz,// Czech
da,// Danish
de,// German
el,// Greek
///
/// 英文
///
en,// English
eu,// Basque
fa,// Persian (Farsi)
fi,// Finnish
fr,// French
gl,// Galician
he,// Hebrew
hi,// Hindi
hr,// Croatian
hu,// Hungarian
id,// Indonesian
it,// Italian
ja,// Japanese
kr,// Korean
la,// Latvian
lt,// Lithuanian
mk,// Macedonian
no,// Norwegian
nl,// Dutch
pl,// Polish
pt,// Portuguese
pt_br,// Português Brasil
ro,// Romanian
ru,// Russian
sv,// se Swedish
se,
sk,// Slovak
sl,// Slovenian
sp,// es Spanish
es,
sr,// Serbian
th,// Thai
tr,// Turkish
ua,// uk Ukrainian
uk,
vi,// Vietnamese
///
/// 简体中文
///
zh_cn,// Chinese Simplified
///
/// 繁体中文
///
zh_tw,// Chinese Traditional
zu// Zulu
};
/**
* \brief
*
* \param l
* \return
*/
const char* LangToString(Lang l) noexcept
{
switch (l)
{
case Lang::af: return "af";// Afrikaans
case Lang::al: return "al";// Albanian
case Lang::ar: return "ar";// Arabic
case Lang::az: return "az";// Azerbaijani
case Lang::bg: return "bg";// Bulgarian
case Lang::ca: return "ca";// Catalan
case Lang::cz: return "cz";// Czech
case Lang::da: return "da";// Danish
case Lang::de: return "de";// German
case Lang::el: return "el";// Greek
case Lang::en: return "en";// English
case Lang::eu: return "eu";// Basque
case Lang::fa: return "fa";// Persian (Farsi)
case Lang::fi: return "fi";// Finnish
case Lang::fr: return "fr";// French
case Lang::gl: return "gl";// Galician
case Lang::he: return "he";// Hebrew
case Lang::hi: return "hi";// Hindi
case Lang::hr: return "hr";// Croatian
case Lang::hu: return "hu";// Hungarian
case Lang::id: return "id";// Indonesian
case Lang::it: return "it";// Italian
case Lang::ja: return "ja";// Japanese
case Lang::kr: return "kr";// Korean
case Lang::la: return "la";// Latvian
case Lang::lt: return "lt";// Lithuanian
case Lang::mk: return "mk";// Macedonian
case Lang::no: return "no";// Norwegian
case Lang::nl: return "nl";// Dutch
case Lang::pl: return "pl";// Polish
case Lang::pt: return "pt";// Portuguese
case Lang::pt_br: return "pt_br";// Português Brasil
case Lang::ro: return "ro";// Romanian
case Lang::ru: return "ru";// Russian
case Lang::sv: return "sv";// se Swedish
case Lang::se: return "se";
case Lang::sk: return "sk";// Slovak
case Lang::sl: return "sl";// Slovenian
case Lang::sp: return "sp";// es Spanish
case Lang::es: return "es";
case Lang::sr: return "sr";// Serbian
case Lang::th: return "th";// Thai
case Lang::tr: return "tr";// Turkish
case Lang::ua: return "ua";// uk Ukrainian
case Lang::uk: return "uk";
case Lang::vi: return "vi";// Vietnamese
case Lang::zh_cn: return "zh_cn";// Chinese Simplified
case Lang::zh_tw: return "zh_tw";// Chinese Traditional
case Lang::zu: return "zu";// Zulu
default: throw std::invalid_argument("nodata");
}
}
#endif
调用:
#include "LanguageList.h"
using namespace std;
int main()
{
std::cout << "Hello World!涂聚文 Geovin Du\n";
std::cout<< LangToString(Lang::zh_cn)<< std::endl;
return 0;
}
第二种方式:
/*****************************************************************//**
* \file DuLanguage.h
* \brief 语言种类
*
* \ IDE vs 2022 C++ 20
* \author geovindu
* \date December 18 2023
* \copyright geovindu 站在巨人的肩膀上 Standing on the Shoulders of Giants
*********************************************************************/
#pragma once
#ifndef DULANGUAGE_H
#define DULANGUAGE_H
#include
/**
* @brief .
*/
#define DuLang(name, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,v11,v12,v13,v14,v15,v16,v17,v18,v19,v20,v21,v22,v23,v24,v25,v26,v27,v28,v29,v30,v31,v32,v33,v34,v35,v36,v37,v38,v39,v40,v41,v42,v43,v44,v45,v46,v47,v48,v49)\
enum name { v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,v11,v12,v13,v14,v15,v16,v17,v18,v19,v20,v21,v22,v23,v24,v25,v26,v27,v28,v29,v30,v31,v32,v33,v34,v35,v36,v37,v38,v39,v40,v41,v42,v43,v44,v45,v46,v47,v48,v49 };\
const char *name##Strings[] = { #v1, #v2, #v3, #v4, #v5, #v6, #v7, #v8, #v9, #v10,#v11,#v12,#v13,#v14,#v15,#v16,#v17,#v18,#v19,#v20,#v21,#v22,#v23,#v24,#v25,#v26,#v27,#v28,#v29,#v30,#v31,#v32,#v33,#v34,#v35,#v36,#v37,#v38,#v39,#v40,#v41,#v42,#v43,#v44,#v45,#v46,#v47,#v48,#v49 };\
const char *name##ToString(int value) { return name##Strings[value]; }
/**
* @brief 语言类型.
*/
DuLang(dLang, af,// Afrikaans
al,// Albanian
ar,// Arabic
az,// Azerbaijani
bg,// Bulgarian
ca,// Catalan
cz,// Czech
da,// Danish
de,// German
el,// Greek
/**
* \brief 英语.
*/
en,// English
eu,// Basque
fa,// Persian (Farsi)
fi,// Finnish
fr,// French
gl,// Galician
he,// Hebrew
hi,// Hindi
hr,// Croatian
hu,// Hungarian
id,// Indonesian
it,// Italian
ja,// Japanese
kr,// Korean
la,// Latvian
lt,// Lithuanian
mk,// Macedonian
no,// Norwegian
nl,// Dutch
pl,// Polish
pt,// Portuguese
pt_br,// Português Brasil
ro,// Romanian
ru,// Russian
sv,// se Swedish
se,
sk,// Slovak
sl,// Slovenian
sp,// es Spanish
es,
sr,// Serbian
th,// Thai
tr,// Turkish
ua,// uk Ukrainian
uk,
vi,// Vietnamese
/**
* @brief 简体中文.
*/
zh_cn,// Chinese Simplified
/**
* @brief 繁体中文.
*/
zh_tw,// Chinese Traditional
zu// Zulu
);
#endif
调用:
#include "DuLanguage.h"
using namespace std;
int main()
{
std::cout << "Hello World!涂聚文 Geovin Du\n";
//int a = 2;
//std::cout<< LangToString(Lang::zh_cn)<< std::endl;
std::cout << dLangToString(dLang::zh_cn)<< std::endl;
return 0;
}
第三种方式:
/*****************************************************************//**
* \file ChineseLang.h
* \brief 语言类型枚举
* https://stackoverflow.com/questions/201593/is-there-a-simple-way-to-convert-c-enum-to-string
* \ IDE vs 2022 C++ 20
* \author geovindu
* \date December 18 2023
* \copyright geovindu 站在巨人的肩膀上 Standing on the Shoulders of Giants
*********************************************************************/
#pragma once
#ifndef CHINESELANG_H
#define CHINESELANG_H
/**
* @brief,不可以再用.如果有类似的语言类型枚举,这个不可以用,互相冲突
* 格式关键
*/
#define DEF_ChinseLang \
Du(af, "af") \
Du(al, "al") \
Du(ar, "ar") \
Du(az, "az") \
Du(bg, "bg") \
Du(ca, "ca") \
Du(cz, "cz") \
Du(da, "da") \
Du(de, "de") \
Du(el, "el") \
Du(en, "en") \
Du(eu, "eu") \
Du(fa, "fa") \
Du(fi, "fi") \
Du(fr, "fr") \
Du(gl, "gl") \
Du(he, "he") \
Du(hi, "hi") \
Du(hr, "hr") \
Du(hu, "hu") \
Du(id, "id") \
Du(it, "it") \
Du(ja, "ja") \
Du(kr, "kr") \
Du(la, "la") \
Du(lt, "lt") \
Du(mk, "mk") \
Du(no, "no") \
Du(nl, "nl") \
Du(pl, "pl") \
Du(pt, "pt") \
Du(pt_br, "pt_br") \
Du(ro, "ro") \
Du(ru, "ru") \
Du(sv, "sv") \
Du(se, "se") \
Du(sk, "sk") \
Du(sl, "sl") \
Du(sp, "sp") \
Du(es, "es") \
Du(sr, "sr") \
Du(th, "th") \
Du(tr, "tr") \
Du(ua, "ua") \
Du(uk, "uk") \
Du(vi, "vi") \
Du(zh_cn, "zh_cn") \
Du(zh_tw, "zh_tw") \
Du(zu, "zu")
enum ChinseLang {
#define Du(name, str) name,
DEF_ChinseLang
#undef Du
CHINESE_count
};
/**
* @brief.
*
* \param c
* \return
*/
const char* ChinseLangToStr(ChinseLang c) {
switch (c) {
#define Du(name, str) case name : return str;
DEF_ChinseLang
#undef Du
default:
return "";
}
}
#endif
调用:
#include "ChineseLang.h"
int main()
{
std::cout << "Hello C++ World! 涂聚文 Geovin Du\n";
std::cout << ChinseLangToStr(ChinseLang(2)) << std::endl; //0 索引开始
std::cout << ChinseLangToStr(ChinseLang(al)) << std::endl;
return 0;
}
主要参考:
https://en.cppreference.com/w/c/preprocessor/replace
https://codereview.stackexchange.com/questions/237410/macro-to-generate-an-enum-and-an-array-of-strings
https://codereview.stackexchange.com/questions/278448/discussing-approaches-for-converting-enum-to-string
https://kubyshkin.name/posts/c-language-enums-tips-and-tricks/