在GCC,我能够做到这一点:
(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实现之间关联这些各种功能的清晰度表示赞赏。
答案 0 :(得分:12)
构造(Type){initialisers}
不是强制转换操作,但它是复合文字的句法结构。
这是一个C99构造,GCC在其C ++编译器中也支持它作为扩展。据我所知,MSVC在C或C ++模式下都不支持复合文字。
此构造的替代方案是
答案 1 :(得分:4)
MSVC不符合C99,只是松散地符合以前版本的C标准。我知道无法用MSVC做你想要的语法,但是使用static const
结构代替匿名复合文字常量和本地struct
变量可以获得相同的效果使用正确的值而不是非常量的匿名复合文字初始化。
这种方法背后的想法是,C99复合文字(至少几乎)等同于同一范围内相同类型的局部变量,用大括号的内容初始化。在数据不变的情况下使用static const
结构只是一种优化(它可能产生比C99复合文字方法更小/更快的代码)。
答案 2 :(得分:1)
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)
{
}
};
答案 3 :(得分:0)
自VS2013开始,Visual Studio支持复合文字和指定的初始化程序。 Which C99 features are available in the MS Visual Studio compiler?
示例:
// main.c
#include <stdio.h>
void func(int(*array)[3]);
int main()
{
// Designated initializers
int a[6] = { [4] = 29, [2] = 15 }; // [0, 0, 15, 0, 29, 0]
struct point { int x, y; };
struct point p = { .y = 13, .x = 27 }; // x = 27, y = 13
union foo { int i; double d; };
union foo f = { .d = 4 }; // d = 4.0
struct point ptarray[5] = { [2].y = 34, [2].x = 42, [0].x = 58 };
// (58 0), (0 0), (42 34), (0 0), (0 0)
// Compound literals
int *a1 = NULL;
a1 = (int[6]) { [4] = 29, [2] = 15 }; // [0, 0, 15, 0, 29, 0]
struct point p1;
p1 = (struct point) { .y = 13, .x = 27 }; // x = 27, y = 13
union foo f1;
f1 = (union foo) { .d = 4 }; // d = 4.0
struct point *ptarray1 = NULL;
ptarray1 = (struct point[5]) { [2].y = 34, [2].x = 42, [0].x = 58 };
// (58 0), (0 0), (42 34), (0 0), (0 0)
int *p2 = NULL;
p2 = (int[2]) { -1 };
p2 = (int[]) { -73, 89, 92 };
func(&(int[]) { -73, 89, 92 });
return 0;
}
void func(int(*array)[3])
{
for (int i = 0; i < 3; i++) {
printf("%d ", (*array)[i]);
}
}