什么是跨平台的方式来处理复合文字在C++? < >在跨平台的方式中,C++中使用复合文字的方法是什么?我知道这是一个扩展而不是“官方”C++,但是一定有一个方法,对吗?

什么是跨平台的方式来处理复合文字在C++? < >在跨平台的方式中,C++中使用复合文字的方法是什么?我知道这是一个扩展而不是“官方”C++,但是一定有一个方法,对吗?,c++,C++,我的结构是: struct v2 { int x, y; }; 我想: 当结构已初始化时,一次性更改所有结构值。 创建一个内联对象,这样我就可以直接将结构作为参数传递给函数 这是可行的,但非常麻烦: v2 position = {0,1}; DoSomething(position); 在MSVC中工作,但在Clang:error:expected中给出语法错误 在Clang中工作,但在MSVC cl.exe中出现语法错误:错误C4576:带括号的类型后跟初始值设定项列表是一种非标

我的结构是:

struct v2 {
    int x, y; 
};
我想:

当结构已初始化时,一次性更改所有结构值。 创建一个内联对象,这样我就可以直接将结构作为参数传递给函数 这是可行的,但非常麻烦:

v2 position = {0,1};
DoSomething(position);
在MSVC中工作,但在Clang:error:expected中给出语法错误

在Clang中工作,但在MSVC cl.exe中出现语法错误:错误C4576:带括号的类型后跟初始值设定项列表是一种非标准的显式类型转换语法

这在MSVC中有效,但在Clang error:expected expression中是一个语法错误

此外,我以后无法更改该值:

position = v2 {1,1};
在MSVC中工作,但不在Clang中工作:错误:函数样式转换或类型构造应为

在Clang中工作,但在MSVC中不工作:错误C4576:带括号的类型后跟初始值设定项列表是一种非标准的显式类型转换语法

有人知道答案吗?

无论v2是否定义为与所有公共成员变量相同:

struct v2 {
    int x, y; 
};
或者像这样使用转换构造函数:

class v2 {
public:
    v2(int X, int Y) : x(X), y(Y) {}

private:
     int x, y; 
};
。。。如果您使用C++11或更高版本的clang++-std=C++11…,您可以这样使用它:

无论v2是否与所有公共成员变量定义为类似:

struct v2 {
    int x, y; 
};
或者像这样使用转换构造函数:

class v2 {
public:
    v2(int X, int Y) : x(X), y(Y) {}

private:
     int x, y; 
};
。。。如果您使用C++11或更高版本的clang++-std=C++11…,您可以这样使用它:


DoSomething{0,1};?你能发一封信吗?当你谈论编译器错误时,你应该把它们包括在问题中。复合文字是C语言的一个特性。你确定你真的需要C++吗?但一定有办法,对吗?不,如果它不是标准C++,而是只提供一些编译器的扩展,那么它就不是便携式的。definition@idclev463035818但是直接列表初始化是MSVC的语法,它是标准C++。clang显然支持它。请澄清您是否需要使用复合文字,或者您是否只需要创建一个内联实例,复合文字就是您认为的解决方案。DoSomething{0,1};?你能发一封信吗?当你谈论编译器错误时,你应该把它们包括在问题中。复合文字是C语言的一个特性。你确定你真的需要C++吗?但一定有办法,对吗?不,如果它不是标准C++,而是只提供一些编译器的扩展,那么它就不是便携式的。definition@idclev463035818但是直接列表初始化是MSVC的语法,它是标准C++。clang显然支持它。请澄清您是否需要使用复合文字,或者您是否只需要创建一个内联实例,复合文字是您认为的解决方案;给出Clang:error:expected表达式中的语法错误。位置={2,3};不工作:提供相同的语法错误:错误:预期表达式。我已经更新了我的原始帖子。@Eddie实际上是。我可以看到它在那个网站上用默认的叮当版本工作,但在这里用默认的叮当不起作用。。。我使用Apple clang 11.0.3版。如果我用这个站点编译的同一行,我得到了语法错误:预期的表达式。@埃迪看到我的更新答案-我认为你的编译器默认为一个古老的C++版本。除非您维护的是一个非常旧的项目,否则绝对没有理由使用C++03或C++98。@Eddie's这是clang++的最新版本,但似乎clang++默认使用C++98,我甚至不知道,因为我总是指定我想要的版本。如果我是正确的,最近的MSVC版本甚至不能设置为C++11模式。我认为C++14是它支持的最古老的语言;给出Clang:error:expected表达式中的语法错误。位置={2,3};不工作:提供相同的语法错误:错误:预期表达式。我已经更新了我的原始帖子。@Eddie实际上是。我可以看到它在那个网站上用默认的叮当版本工作,但在这里用默认的叮当不起作用。。。我使用Apple clang 11.0.3版。如果我用这个站点编译的同一行,我得到了语法错误:预期的表达式。@埃迪看到我的更新答案-我认为你的编译器默认为一个古老的C++版本。除非您维护的是一个非常旧的项目,否则绝对没有理由使用C++03或C++98。@Eddie's这是clang++的最新版本,但似乎clang++默认使用C++98,我甚至不知道,因为我总是指定我想要的版本。如果我是正确的,最近的MSVC版本甚至不能设置为C++11模式。我认为C++14是它支持的最古老的版本。
struct v2 {
    int x, y; 
};
class v2 {
public:
    v2(int X, int Y) : x(X), y(Y) {}

private:
     int x, y; 
};
void DoSomething(const v2& v) {
    //... do something ...
}

int main() {
    DoSomething({0, 1});

    v2 position = {1, 2};
    DoSomething(position);
    
    position = {2, 3};
    DoSomething(position);
}