Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在表中实现字符串文字及其大小_C_Arrays_String_Sizeof_String Literals - Fatal编程技术网

C 在表中实现字符串文字及其大小

C 在表中实现字符串文字及其大小,c,arrays,string,sizeof,string-literals,C,Arrays,String,Sizeof,String Literals,我正在寻找C语言中具有大小的字符串文字的最优雅的实现。主要的一点是,我希望编译器在编译时计算sizeof(“某些字符串文字”) 到目前为止,我可以想到以下两种可能性(参见下面的代码): 为选项A键入两次字符串。这不是一个好的解决方案,因为如果有许多字符串并且必须更改一个字符串,则可能会出现键入错误 定义字符串文字,然后在表中使用这些文字,与选项B相同 还是有更优雅的解决方案 #define STR_OPTION_B "Option B" typedef struct { enum {

我正在寻找C语言中具有大小的字符串文字的最优雅的实现。主要的一点是,我希望编译器在编译时计算sizeof(“某些字符串文字”)

到目前为止,我可以想到以下两种可能性(参见下面的代码):

  • 为选项A键入两次字符串。这不是一个好的解决方案,因为如果有许多字符串并且必须更改一个字符串,则可能会出现键入错误

  • 定义字符串文字,然后在表中使用这些文字,与选项B相同

  • 还是有更优雅的解决方案

    #define STR_OPTION_B "Option B"
    
    typedef struct
    {
        enum {
            OPTION_A,
            OPTION_B
        } optionIDs;
        char* pString;
        int sizeOfString;
    }
    tTableElement;
    
    tTableElement table[] =
    {
        { OPTION_A, "Option A", sizeof("Option A") },
        { OPTION_B, STR_OPTION_B, sizeof(STR_OPTION_B) }
    };
    
    使用
    #define
    宏将字符串和字符串大小放入结构中

    #define STR_ENTRY(x) x, sizeof(x)
    tTableElement table[] =
    {
        { OPTION_A, STR_ENTRY("Option A") },
        { OPTION_B, STR_ENTRY("Option B") }
    };
    #undef STR_ENTRY
    
    这应该扩展到字面上:

    tTableElement table[] =
    {
        { OPTION_A, "Option A", sizeof("Option A") },
        { OPTION_B, "Option B", sizeof("Option B") }
    };
    
    使用
    #define
    宏将字符串和字符串大小放入结构中

    #define STR_ENTRY(x) x, sizeof(x)
    tTableElement table[] =
    {
        { OPTION_A, STR_ENTRY("Option A") },
        { OPTION_B, STR_ENTRY("Option B") }
    };
    #undef STR_ENTRY
    
    这应该扩展到字面上:

    tTableElement table[] =
    {
        { OPTION_A, "Option A", sizeof("Option A") },
        { OPTION_B, "Option B", sizeof("Option B") }
    };
    

    你认为什么是优雅?友好,易于实现,可读。你认为什么是优雅?友好,易于实现,可读性。即使宏的寿命由于<<代码> unDEFF < /代码>而受到限制,你可能应该避免从一个领先的下划线开始的名字(尤其是在大写字母后面)。尽管如此。@abelenky:所有以前导下划线开头,后跟大写字母或其他下划线的标识符都保留在任何范围内。带有前导下划线的标识符保留在全局范围内。(请参阅)尽管宏的生存期因
    #unde
    而受到限制,但您可能应该避免使用以前导下划线开头的名称(尤其是后跟大写字母时),尽管如此。@abelenky:所有以前导下划线开头,后跟大写字母或其他下划线的标识符都保留在任何范围内。带有前导下划线的标识符保留在全局范围内。(见附件)