相关疑难解决方法(0)

C++结构初始化

是否可以在C++中初始化结构,如下所示

struct address {
    int street_no;
    char *street_name;
    char *city;
    char *prov;
    char *postal_code;
};
address temp_address =
    { .city = "Hamilton", .prov = "Ontario" };
Run Code Online (Sandbox Code Playgroud)

这里这里的链接提到可以仅在C中使用此样式.如果是这样,为什么在C++中这是不可能的?是否有任何潜在的技术原因导致它没有在C++中实现,或者使用这种风格是不好的做法.我喜欢使用这种初始化方式,因为我的结构很大,这种风格让我清楚地看到了为哪个成员分配了什么值.

如果有其他方法可以达到相同的可读性,请与我分享.

在发布此问题之前,我已经提到了以下链接

  1. C/C++ for AIX
  2. C变量的结构初始化
  3. 使用C++中的标记进行静态结构初始化
  4. C++ 11正确的结构初始化

c++

259
推荐指数
10
解决办法
44万
查看次数

C++中是否有隐式默认构造函数?

在我正在阅读的书中(C++ Without Fear),它表示如果你没有为一个类声明一个默认构造函数,那么编译器会为你提供一个"零逻辑".我已经尝试过这个,而且我没有看到任何归零行为.我也找不到任何在Google上提到这一点的内容.这只是一个错误或特定编译器的怪癖?

c++ constructor

63
推荐指数
7
解决办法
5万
查看次数

在C++ 14中,C++标准是否在使用不确定值和未定义行为方面发生了变化?

正如初始化所述,需要进行左值到右值的转换?是int x = x;UB吗?C++标准在3.3.2 声明部分中有一个令人惊讶的例子,其中a int用它自己的不确定值初始化:

int x = 12;
{ int x = x; }
Run Code Online (Sandbox Code Playgroud)

这里第二个x用它自己的(不确定的)值初始化.- 结束例子 ]

Johannes对此问题的回答表明是未定义的行为,因为它需要左值到右值的转换.

在最新的C++ 14草案标准中N3936,可以在此处找到此示例已更改为:

unsigned char x = 12;
{ unsigned char x = x; }
Run Code Online (Sandbox Code Playgroud)

这里第二个x用它自己的(不确定的)值初始化.- 结束例子 ]

C++ 14中有关于不确定值和未定义行为的变化,这些变化在示例中引发了这种变化吗?

c++ undefined-behavior language-lawyer c++11 c++14

62
推荐指数
1
解决办法
3991
查看次数

C++类成员的默认值是什么

结构成员和c ++中类成员的默认值是什么,以及这些规则如何不同(例如,类/结构/基元/等之间)?是否存在有关默认值的规则不同的情况?

c++ struct class default-value

51
推荐指数
2
解决办法
3万
查看次数

C++中的变量初始化

我的理解是int变量将0自动初始化; 但事实并非如此.下面的代码打印一个随机值.

int main () 
{   
    int a[10];
    int i;
    cout << i << endl;
    for(int i = 0; i < 10; i++)
        cout << a[i] << " ";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)
  • 什么规则(如果有的话)适用于初始化?
  • 具体来说,在什么条件下变量自动初始化?

c++ variables initialization

42
推荐指数
3
解决办法
6万
查看次数

全局内存是用C++初始化的吗?

全局内存是用C++初始化的吗?如果是这样,怎么样?

(二)澄清:

当程序启动时,在初始化基元之前,内存空间中的内容将成为全局内存?我试图了解它是否被清零,或者例如垃圾.

情况是:可以instance()在初始化之前通过调用设置单例引用:

MySingleton* MySingleton::_instance = NULL;
Run Code Online (Sandbox Code Playgroud)

并获得两个单例实例?

在单个多个实例上查看我的C++测验...

c++ memory memory-management

13
推荐指数
3
解决办法
7082
查看次数

是否必须将"sockaddr_in"结构归零?

无论我到哪里,我都会看到以下代码:

struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = ip;
Run Code Online (Sandbox Code Playgroud)

在C++中,同样的想法通常表示为

sockaddr_in addr = {}; // unneccesary(?) value-initialzation
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = ip;
Run Code Online (Sandbox Code Playgroud)

然而,在我设置这些成员之前,我没有看到(在官方文档方面)我有任何要求将结构清零!是的,通常BSD套接字实现做有一个sin_zero用于定义的成员sockaddr_in,但他们总是说需要进行填充成员,对齐的大小sockaddr_insockaddr.他们从不要求人们将任何具体内容放入其中.

有没有真正的,文件证明需要零出结构?

PS之前VTC问题的若干SO一个问题的有关副本memsetsockaddr_in,请确保该问题您所提出的建议为重复有正式文件,而不是"以防万一未使用成员的初始化"只是猜测的任何链接.

c c++ sockets language-lawyer

9
推荐指数
1
解决办法
1048
查看次数

匿名结构中的Brace-or-equal-initializers在VS2013上不起作用

结构中的匿名结构中的Brace-or-equal-initializers不会对VS2013生成的输出执行任何操作.有代码:

#include <iostream>
#include <cstdint>


struct S
{
    struct
    {
        uint64_t val = 0;
    }anon;
};

int main()
{
    S s;
    S *a = new S;

    std::cout << s.anon.val << std::endl;
    std::cout << a->anon.val << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在Linux上使用此命令编译:

g++ -std=c++11 def-init-anon-atruct.cpp -o def-init-anon-atruct
Run Code Online (Sandbox Code Playgroud)

(添加优化标志不会影响结果)

预期结果:

0
0
Run Code Online (Sandbox Code Playgroud)

奇怪的.使用VS2013运行它会产生垃圾值.在实施C++ 11标准方面,谁在这方面是正确的?我非常怀疑这是海湾合作委员会的错.

是否与一些无用的VS编译器选项有关?Windows扩展?由于MS制造的错误,我必须为结构制作默认构造函数?这很荒谬.

member-initialization c++11 anonymous-struct visual-c++-2013

9
推荐指数
2
解决办法
272
查看次数

initializing struct with {0}

I'm debugging some code that essentially is identical to this:

struct Foo { int a; int b; };
struct Bar { Bar() {} Foo foo{0}; };
Run Code Online (Sandbox Code Playgroud)

When I make an instance of Bar, it seems like both a and b are initialized to zero. Is this guaranteed? Where can I find that in the spec?

c++ initialization

8
推荐指数
1
解决办法
99
查看次数

struct的数组成员的默认值

可能重复:
对C++类中的数组进行初始化和可修改的左值问题

正如在这个问题中看到的那样,可以给一个结构提供一个ctor,使其成员获得默认值.您将如何继续为结构内的数组的每个元素提供默认值.

struct foo
{
   int array[ 10 ];
   int simpleInt;
   foo() : simpleInt(0) {}; // only initialize the int...
}
Run Code Online (Sandbox Code Playgroud)

有没有办法在一行中使用类似于初始化int的方法?

c++ arrays constructor struct initialization

5
推荐指数
1
解决办法
4471
查看次数