首页 > 编程语言 >cpp: enum in C,C++

cpp: enum in C,C++

时间:2023-12-18 20:36:39浏览次数:31  
标签:Lang case EnumLangTypeCase return enum C++ DUX cpp Du

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 <iostream>
 
 
/**
 * \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
    /// <summary>
    /// 英文
    /// </summary>
    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
    /// <summary>
    /// 简体中文
    /// </summary>
    zh_cn,// Chinese Simplified
    /// <summary>
    /// 繁体中文
    /// </summary>
    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 <iostream>
 
/**
 * @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;
}

  

from:

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/

 

标签:Lang,case,EnumLangTypeCase,return,enum,C++,DUX,cpp,Du
From: https://www.cnblogs.com/geovindu/p/17912172.html

相关文章

  • C++图的邻接表创建
    C++图的邻接表存储结构typedefstructNode{ intnextVex; structNode*next; }*node;structHeadNode{ Eelement; structNode*next;};typedefstructGraphTable{ intvex,edge; structHeadNodeVertex[MAXV];}*Graph;图的创建函数Graphcreate(){ Grap......
  • 29道C++ 面向对象高频题整理(附答案背诵版)
    1、什么是类?在C++中,类是一种用户定义的数据类型,它可以包含数据成员和函数成员。数据成员用于存储与类相关的状态,而函数成员可以定义对这些数据进行操作的方法。可以把类想象为一个蓝图,根据这个蓝图可以创建对象,这些对象在内存中是类的实例。比如说,我们可以定义一个Car类来表示汽......
  • 2023最新中级难度C++面试题,包含答案。刷题必备!记录一下。
    好记性不如烂笔头内容来自面试宝典-中级难度C++面试题合集问:什么是虚函数和纯虚函数?它们有什么区别?虚函数是一种在基类中声明的函数,它可以在派生类中被覆盖以实现多态性。纯虚函数是一种特殊的虚函数,它没有定义任何具体的行为,只声明了一个接口。纯虚函数的目的是为了让......
  • 2023最新高级难度C++面试题,包含答案。刷题必备!记录一下。
    好记性不如烂笔头内容来自面试宝典-高级难度C++面试题合集问:详细解释一下C++中的虚继承(virtualinheritance)的概念及其应用场景。虚继承是一种特殊的继承方式,用于解决多重继承中可能出现的菱形继承问题。菱形继承会导致基类被复制多次,占用额外的内存,并可能导致数据混乱......
  • C++ new与delete
    C++new与delete在C语言中,动态分配内存时一般常使用malloc()函数,但是对于非内置数据类型(如struct、enum、class),malloc()与free()无法满足动态对象的需求,因此C++引入new与delete关键字,用来进行内存申请与释放空间。1.new运算符new运算符用来申请一块连续的内存,其格式如下:new......
  • 万字长文全面详解现代C++智能指针:原理、应用和陷阱
    现代C++智能指针详解:原理、应用和陷阱智能指针是C++11引入的新特性。本篇文章详细介绍了C++智能指针的原理、应用与陷阱,通过丰富的代码实例介绍了三种智能指针:std::unique_ptr、std::shared_ptr和std::weak_ptr的原理、使用方法和适用场景,还介绍了智能指针的线程安全性、使用陷阱......
  • 关于`.Net Core`捕捉`C/C++`中的异常
    结论开门见山的说,.NetCore无法捕捉在C/C++编写的Dll中的方法的异常和错误。说明在.NetFramework框架期间,可以通过为方法增加特性:HandleProcessCorruptedStateExceptionsAttribute,或者使用RuntimeWrapperException捕捉运行时的错误,但是在.NetCore框架中,上述特性已经不再生......
  • 无涯教程-Java - Enumeration 枚举接口函数
    Enumeration接口定义了可以枚举对象集合中的元素的方法。下表总结了Enumeration声明的方法-Sr.No.Method&Remark1booleanhasMoreElements()当实现时,必须在提取更多元素时返回true,而在列举所有元素时返回false。2ObjectnextElement()这将返回枚举中的下一个对象......
  • 2023最新初级难度C++面试题,包含答案。刷题必备!记录一下。
    好记性不如烂笔头内容来自面试宝典-初级难度C++面试题合集问:C++支持哪些基本数据类型?C++支持以下基本数据类型:布尔型、字符型、整型(包括短整型、长整型、无符号整型)、浮点型(包括单精度浮点型和双精度浮点型)、复数型以及枚举型等。此外,C++还提供了一些复合类型,如数组、结......
  • C++(虚函数和纯虚函数的区别)
    在C++中,虚函数和纯虚函数都与面向对象编程中的多态性相关,但它们有一些关键的区别。虚函数(VirtualFunction):定义:虚函数是在基类中声明并在派生类中定义的函数,使用virtual关键字进行声明。在基类中可以提供一个默认实现,但在派生类中可以选择覆盖(override)它。实现:虚函数可......