Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 初始化一个全局常量POD结构;针对特定成员_C++_C++11_Struct - Fatal编程技术网

C++ 初始化一个全局常量POD结构;针对特定成员

C++ 初始化一个全局常量POD结构;针对特定成员,c++,c++11,struct,C++,C++11,Struct,说 标头声明了结构timespec,它在 至少有下列成员: 时间-电视-秒长 电视毫微秒 我在C++中使用这个,我想做如下: //global scope const /*struct*/ timespec ARMAGEDDON = { .tv_sec = std::numeric_limits<decltype((timespec().tv_sec))>::max(), .tv_nsec = std::numeric_limits<decltype((tim

标头声明了结构timespec,它在 至少有下列成员: 时间-电视-秒长 电视毫微秒

<>我在C++中使用这个,我想做如下:

//global scope
const /*struct*/ timespec ARMAGEDDON = {
    .tv_sec = std::numeric_limits<decltype((timespec().tv_sec))>::max(), 
    .tv_nsec = std::numeric_limits<decltype((timespec().tv_nsec))>::max(), 
};
碰巧是编译的,但是AFAIK,这初始化了前两个成员。 API提供商没有说
.tv\u sec
.tv\u nsec
是前两个成员

什么是C++中结构初始化的正确方法?

< p>
timespec ARMAGEDDON;
ARMAGEDDON.tv_sec = ...;
ARMAGEDDON.tv_nsec = ...;
如果确实希望它是
常量
,可以将其移动到函数中:

timespec makeArmageddon() {
    timespec ts;
    ts.tv_sec = ...;
    ts.tv_nsec = ...;
    return ts;
}

const timespec ARMAGEDDON = makeArmageddon();
由于API只是说它至少有这些成员,甚至没有指定它们是前两个成员,所以我最好避免聚合初始化。是的,这里指定的初始化器会很棒,但我还是宁愿写C++。< /P> < P>
timespec ARMAGEDDON;
ARMAGEDDON.tv_sec = ...;
ARMAGEDDON.tv_nsec = ...;
如果确实希望它是
常量
,可以将其移动到函数中:

timespec makeArmageddon() {
    timespec ts;
    ts.tv_sec = ...;
    ts.tv_nsec = ...;
    return ts;
}

const timespec ARMAGEDDON = makeArmageddon();

由于API只是说它至少有这些成员,甚至没有指定它们是前两个成员,所以我最好避免聚合初始化。是的,这里指定的初始化器会很棒——但我还是愿意写C++。

如果你不想凌乱你的全局命名空间,想要有类似C风格的初始化,你可以使用lambda表达式来构造和对象。
const timespec ARMAGEDDON = []() -> timespec {
    timespec result;
    result.tv_sec = std::numeric_limits<decltype(result.tv_sec)>::max();
    result.tv_nsec = std::numeric_limits<decltype(result.tv_nsec)>::max();
    return result;
}();
const timespec ARMAGEDDON=[]()->timespec{
timespec结果;
result.tv_sec=std::numeric_limits::max();
result.tv_nsec=std::numeric_limits::max();
返回结果;
}();
编辑:如果您的编译器是相当最新的,您应该能够使用略短的结构:

const timespec ARMAGEDDON = [](){
    timespec result;
    result.tv_sec = std::numeric_limits<decltype(result.tv_sec)>::max();
    result.tv_nsec = std::numeric_limits<decltype(result.tv_nsec)>::max();
    return result;
}();
const timespec ARMAGEDDON=[](){
timespec结果;
result.tv_sec=std::numeric_limits::max();
result.tv_nsec=std::numeric_limits::max();
返回结果;
}();

如果您不想让全局名称空间变得杂乱无章,并且希望有类似于C风格初始化的东西,您可以始终使用lambda表达式构造和对象

const timespec ARMAGEDDON = []() -> timespec {
    timespec result;
    result.tv_sec = std::numeric_limits<decltype(result.tv_sec)>::max();
    result.tv_nsec = std::numeric_limits<decltype(result.tv_nsec)>::max();
    return result;
}();
const timespec ARMAGEDDON=[]()->timespec{
timespec结果;
result.tv_sec=std::numeric_limits::max();
result.tv_nsec=std::numeric_limits::max();
返回结果;
}();
编辑:如果您的编译器是相当最新的,您应该能够使用略短的结构:

const timespec ARMAGEDDON = [](){
    timespec result;
    result.tv_sec = std::numeric_limits<decltype(result.tv_sec)>::max();
    result.tv_nsec = std::numeric_limits<decltype(result.tv_nsec)>::max();
    return result;
}();
const timespec ARMAGEDDON=[](){
timespec结果;
result.tv_sec=std::numeric_limits::max();
result.tv_nsec=std::numeric_limits::max();
返回结果;
}();

您是否考虑过类似于
const-timespec-ARMAGEDDON=InitTimeSpec()
并让
InitTimeSpec
分别初始化每个成员。如果您使用的是
C++11
,您可能应该标记这个
C++11
,您是否考虑过类似
const timespec ARMAGEDDON=InitTimeSpec()
并让
InitTimeSpec
分别初始化每个成员。如果您正在使用的是
C++11
,则可能应该标记此。我以为这在全球范围内不起作用,但它确实起作用了。谢谢为了避免杂乱的全局命名空间,考虑在匿名命名空间中定义<代码> MAKEARMAGEDEDON/COM>。@ GWAZODRRR <代码>静态< /代码>也做得很好(比匿名命名空间,IMO稍微优雅一点)。有趣。我以为这在全球范围内不起作用,但它确实起作用了。谢谢为了避免杂乱的全局命名空间,考虑在匿名命名空间中定义<代码> MAKEARMAGEDEDON/COM>。@ GWAZODRRR <代码>静态< /代码>也做得很好(比匿名命名空间,IMO稍微优雅一点)。