【问题标题】:C2059 in VS2012 : How to initialize struct instance?VS2012 中的 C2059:如何初始化结构实例?
【发布时间】:2014-06-02 02:21:39
【问题描述】:

我有一个 .c 文件,我正在尝试在 VS2012 中编译,但我收到此错误:

error C2059: syntax error : '.' main.c  

根据我读到的内容,这是 VS2012 编译器的一个特定问题,我不会在其他编译器中遇到这个问题。不管这是否属实,我希望这里有人能告诉我如何修复这个编译器错误。如何修改代码,使代码能够编译并且行为相同?

这是我的头文件中的内容:

struct mystruct 
{
    struct someOtherStruct obj2;
    void* ptr1;
    void* ptr2;
    void* ptr3;
};

这就是我在 main.c 中的内容

void* P1 = NULL;
void* P2 = NULL;
void* P3 = NULL;

/* VS2012 complains about this syntax */
static struct mystruct obj = 
{
.ptr1 = P1,
.ptr2 = P2,
.ptr3 = P3,
};


void main(void)
{
    /* Empty for now */
}

【问题讨论】:

  • 在初始化结构时使用成员名称是 C 的“最新”版本的一个特性。C 编译器似乎有点落后于时代,因为它不能识别最新的语法,所以使用较旧的语法,如@Praetorian 所示。所有 C 编译器仍支持旧语法。

标签: c visual-studio-2012 gcc struct


【解决方案1】:

VS2013 (finally) supports 指定了初始化器,所以你必须升级你的编译器来获得这个特性。否则重写您的初始化程序,使其符合 C89。

static struct mystruct obj = 
{
    { /* initialize someOtherStruct members here */ },
    P1,  /* drop the member names */
    P2,
    P3,
};

如果您不想费心为someOtherStruct 编写初始化程序,请重新排序mystruct 的成员,以便编译器自动将obj2 初始化为零:

struct mystruct 
{
    void* ptr1;
    void* ptr2;
    void* ptr3;
    struct someOtherStruct obj2;
};

static struct mystruct obj = 
{
    P1,
    P2,
    P3,
};

【讨论】:

    【解决方案2】:

    Designated initializers 是 C99(或更高版本)功能,Visual Studio 不支持 C99(或更高版本)。等效的 VS 兼容初始化如下所示:

    static struct mystruct obj = 
    {
        { 0 },
        P1,
        P2,
        P3
    };
    

    如果您希望保留相同的代码,Clang/LLVM 和 GCC 都支持 C11 并且可用于 Windows。

    【讨论】:

    • 我基本上写了和你一样的答案,然后找到this。 VS2013 确实支持指定的初始化器。和MSDN link 差不多。
    • 欢迎来到未来,我猜... ;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多