2016-08-11 50 views
-1

下面的代码是一个开源C程序的片段。 Visual Studio将较低结构成员中的点指出为错误。怪异语法背后的原理是什么,以及如何让Visual Studio接受它是正确的。我知道这是正确的。我一次又一次地看到它在开源代码中,但每次VS拒绝它,我转储代码。我觉得这次我应该用角来看看公牛。这个结构语法背后的原理是什么?我如何让Visual Studio接受它是正确的?

static struct scrypt_test{ 
     const char *passwd; 
     cosnt char *salt; 
     uint64_t N; 
     unint32_t r; 
     unint32_t p; 
     uint8_t result[TESTLEN]; 
} testcase = { 
     .passwd = "pleaseletmein", 
     .salt = "sodiumChloride", 
     .N = 16, 
     .r = 8, 
     .p = 1, 
     .result = { /*some entries*/} 
} 
+0

你会得到什么错误? – SLaks

+0

它是结构体变量'testcase'的[指定初始化](https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html)。从C99开始应该支持它。 –

+8

微软对“现代”C的支持历来非常有限。 – molbdnilo

回答

1

Visual Studio不支持指定的初始值。使用简单的支撑构造器。

编辑:MSVS15支持指定的初始值设定项。其实MSVS13和MSVS14也支持他们,但他们有一些known bugs关于指定的初始化。

+0

即使有c99/11开关(不知道它是否存在,虽然..) –

+0

哇!他们最终成功地支持C标准的17年版本的一些更简单的功能?所以我们可以预计 - 2028年的C11支持? ; - } – Olaf

1

什么是wied语法

大括号包围的代码以下testcase =背后的原理是可变testcase的初始化。它使用C99风格的指定初始化器来阐明哪个struct元素由每个成员初始化器初始化。格式为.<member_name> = <member_value>。除了清晰之外,此表格还允许您以任何顺序给会员,也可以跳过会员,尽管所提供的代码不会执行这些选项。

我该如何让视觉工作室接受它是正确的。

您不能让旧版本的VS接受此代码。不接受它是这些版本的VS不符合C99的几种方法之一,更不用说C2011。如果你使用旧的VS来构建C项目,那么你需要做好准备将代码改变为它将接受的东西。在这种情况下,这将意味着删除成员代号:

// ... 
} testcase = { 
    "pleaseletmein", 
    "sodiumChloride", 
    16, 
    8, 
    1, 
    { /*some entries*/} 
}; 

没有代号,成员初始化必须出现在相同的顺序成员本身在结构声明做。

但是,如果你可以升级到最新的VS,或者如果你可以转储更好的VS,那么这些可能是你最好的选择。

+0

终于有完整的C99支持了吗?如果没有,更好的建议是使用像gcc或afaik-clang这样的兼容编译器。 – Olaf

相关问题