MSVC中的复合文字

在海湾合作委员会,我能够这样做:

(CachedPath){ino} inode->data = (struct Data)DATA_INIT; 

哪里:

 struct CachedPath { Ino ino; }; typedef int8_t Depth; struct Data { Offset size; Blkno root; Depth depth; }; #define DATA_INIT {0, -1, 0} 

MSVC为这些类型的强制转换提供以下错误:

 error C2143: syntax error : missing ';' before '{' 

我怎样才能在MSVC中这样做? 进一步注意,代码已经从C99转换而来,我为此使用了指定的初始值设定项,然后进行类似的转换。 关于C99与C ++的MSVC / GCC实现之间如何关联这些各种特征的任何清晰都是值得赞赏的。

构造(Type){initialisers}不是强制转换操作,但它是复合文字的句法结构。 这是一个C99构造,GCC在其C ++编译器中也支持它作为扩展。 据我所知,MSVC在C或C ++模式下都不支持复合文字。

这种结构的替代方案是

  • 显式声明并初始化所需结构类型的临时对象,并使用它而不是赋值中的复合文字
  • 不是使用复合文字进行单一赋值,而是为每个单独的成员使用单独的赋值。

MSVC不符合C99,只是松散地符合以前版本的C标准。 我知道没有办法在语法上用MSVC做你想要的,但是通过使用static const结构而不是匿名复合文字常量,以及使用正确值而不是匿名复合文字来初始化的局部struct变量,可以获得相同的效果。非恒定。

这种方法背后的想法是,C99复合文字(至少几乎)相当于同一范围内相同类型的局部变量,用大括号的内容初始化。 在数据不变的情况下使用static const结构只是一种优化(它可能会产生比C99复合文字方法更小/更快的代码)。

MSVC是标准的混合,并且不完全符合它们中的大多数,因此,您可能需要使用默认的初始化器/构造函数,如此(C ++方式):

 #define DATA_INIT 0,-1,0 inode->data = Data(DATA_INIT); struct Data { Offset size; Blkno root; Depth depth; Data(Offset size, Blkno root, Depth depth) : size(size), root(root), depth(depth) { } };