C/C++---C and CXX compiler with c or cpp in struct

C/C++中结构体初始化方法

#include <stdio.h>

enum SIZE {
    SIZE_ONE    = 1,
    SIZE_TWO    = 2,
    SIZE_THREE  = 3
};

struct DATA{
    int         data1;
    char        data2;
    enum SIZE   size;
};

struct STRUCT_INIT_TEST{
    int     num1;
    char    *str1;
    char    *str2;
    int     num2;
};

int main()
{
    // 初始化方式一,C/C++通用
    struct STRUCT_INIT_TEST test1 = {2, "string1", "string2", 4};
    // 初始化方式二,可以乱序,但是只能以.c结尾并用gcc编译,但是按变量顺序初始化,可以用g++编译通过
    struct STRUCT_INIT_TEST test2 = {
        .num1 = 2,
        .str2 = "string2",
        .str1 = "string1",
        .num2 = 4
    };
    // 初始化方式三,可以乱序,但是按变量顺序来初始化,gcc/g++均能够编译以.c或.cpp的文件
    struct STRUCT_INIT_TEST test3 = {
        num1 : 2,
        str1 : "string1",
        str2 : "string2",
        num2 : 4
    };

    return 0;
}

总结:

  • 方式一:按结构体变量顺序初始化相应变量,在变量的前面不能有未初始化的变量,而后面允许有变量未初始化。
  • 方式二,可以乱序,但是只能以.c结尾并用gcc编译,但是按变量顺序初始化,可以用g++编译通过
  • 方式三,可以乱序,但是如果是对于结构体中的每个成员变量都按顺序初始化,那么gcc/g++对于.c或者.cpp均能够编译通过(在gcc4.6.x和gcc4.9.x上测试通过)
// 对于联合体的情况下:

typedef struct
{
    COMBO_DEV       devno;              /* device number, select sensor0 and sensor 1 */
    input_mode_t    input_mode;         /* input mode: MIPI/LVDS/SUBLVDS/HISPI/DC */
    phy_clk_share_e phy_clk_share;
    img_rect_t      img_rect;           /* MIPI Rx device crop area (corresponding to the oringnal sensor input image size) */

    union
    {
        mipi_dev_attr_t     mipi_attr;
        lvds_dev_attr_t     lvds_attr;
    };
} combo_dev_attr_t;

// 初始化方法:
combo_dev_attr_t SUBLVDS_4lane_SENSOR_MN34220_12BIT_1080_NOWDR_ATTR =
{
    .devno         = 0,
    .input_mode    = INPUT_MODE_SUBLVDS,                /* input mode */
    .phy_clk_share = PHY_CLK_SHARE_NONE,
    .img_rect = {0, 0, 1920, 1108},
    {   // 此处需要加‘{’,否则只能用gcc编译通过
        .lvds_attr = {
            .raw_data_type    = RAW_DATA_12BIT,
            .wdr_mode         = HI_WDR_MODE_NONE,
            .sync_mode        = LVDS_SYNC_MODE_SOF,
            .vsync_type       = {LVDS_VSYNC_NORMAL, 0, 0},
            .fid_type         = {LVDS_FID_NONE, HI_TRUE},
            .data_endian      = LVDS_ENDIAN_BIG,
            .sync_code_endian = LVDS_ENDIAN_BIG,
            .lane_id = {0, 2, -1, -1, 1, 3, -1, -1, -1, -1, -1, -1},
            .sync_code = {
                {   {0x002, 0x003, 0x000, 0x001},      // lane 0
                    {0x002, 0x003, 0x000, 0x001},
                    {0x002, 0x003, 0x000, 0x001},
                    {0x002, 0x003, 0x000, 0x001}
                },

                {
                    {0x012, 0x013, 0x010, 0x011},      // lane 1
                    {0x012, 0x013, 0x010, 0x011},
                    {0x012, 0x013, 0x010, 0x011},
                    {0x012, 0x013, 0x010, 0x011}
                },

                {
                    {0x006, 0x007, 0x004, 0x005},      // lane2
                    {0x006, 0x007, 0x004, 0x005},
                    {0x006, 0x007, 0x004, 0x005},
                    {0x006, 0x007, 0x004, 0x005}
                },

                {
                    {0x016, 0x017, 0x014, 0x015},      // lane3
                    {0x016, 0x017, 0x014, 0x015},
                    {0x016, 0x017, 0x014, 0x015},
                    {0x016, 0x017, 0x014, 0x015}
                }
            }
        }
    }
};

  如上面,联合体的初始化需要在用g++的编译中加上花括号。

  进一步总结,在程序设计中,考虑到代码的可兼容性和可移植性(低版本编译器),切换使用gcc/g++编译,那么需要对结构体的初始化要考虑周到。这里建议采用第二种或者第三种方式,并操持按变量顺序来初始化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值