小编Abh*_*yal的帖子

char枚举中的值分配不正确

我正在使用枚举,并尝试从此页面重现一些示例.最初的例子按预期工作,但是我得到了一些有趣的结果,代码如下:

#include <iostream>

enum num : char {
    zero = '0',
    one = '1',
    two = '2',
    three = '3',
    four = '4',
    five = '5',
    six = '6'
};

int main()
{
    const char two = '2';
    std::cout << two << std::endl;
    std::cout << num::two;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出是:

2
50

我预计两种结果都是相同的,但num::two似乎打印出其他一些值.此值也不会改变(50),所以我假设这不是随机/垃圾值,并且有一些char/int解析正在完成,我不明白?这是ideone链接.

我知道我可以通过这样分配来实现它zero = 0,没有单引号并且它有效.但是,我想知道幕后发生了什么,我怎么能控制通过单引号分配可以打印的非单位数值.

c++ enums type-conversion implicit-conversion c++11

24
推荐指数
5
解决办法
3979
查看次数

make_unique value是否初始化char数组

例如 -

#include <memory>

int main(){
    const auto bufSize = 1024;
    auto buffer = std::make_unique<char[]>(bufSize);
}
Run Code Online (Sandbox Code Playgroud)

这里的缓冲区是否已经填充了'\0'字符,或者我必须手动填充它以避免垃圾值.

什么可能的方法,这样就std::memset(&buffer.get(), 0, bufSize)足够了?

c++ memory smart-pointers c++11 c++14

18
推荐指数
3
解决办法
5236
查看次数

从具有不同子类的父指针调用子方法

我有一个父类,有两个或更多的子类派生自它.随着更多要求的出现,未来不同子类的数量可能会增加,但它们都将遵循基类方案,并且将包含很少的独特方法.让我举一个例子 -

#include <iostream>
#include <string>
#include <vector>
#include <memory>

class B{
    private: int a; int b;
    public: B(const int _a, const int _b) : a(_a), b(_b){}
    virtual void tell(){ std::cout << "BASE" << std::endl; }
};

class C : public B{
    std::string s;
    public: C(int _a, int _b, std::string _s) : B(_a, _b), s(_s){}
    void tell() override { std::cout << "CHILD C" << std::endl; }
    void CFunc() {std::cout << "Can be called only from C" << std::endl;}
};

class …
Run Code Online (Sandbox Code Playgroud)

c++ oop inheritance class c++11

17
推荐指数
5
解决办法
2446
查看次数

atoi()用于int128_t类型

如何argvint128_t支持下使用值?我知道atoi()暴露的函数和函数系列,<cstdlib>但不知怎的,我找不到一个int128_t固定宽度整数.这可能是因为这type不受c或c ++标准的支持,但是我有什么方法可以让这段代码工作吗?

#include <iostream>

int main(int argc, char **argv) {
    __int128_t value = atoint128_t(argv[1]);
}
Run Code Online (Sandbox Code Playgroud)

几乎所有发布的答案对我来说都足够好了,但我选择的是当前代码的解决方案,所以也要查看其他答案.

c c++ int

15
推荐指数
2
解决办法
1779
查看次数

将围绕sockaddr_storage和sockaddr_in强制转换为严格别名

按照我之前的问题,我对这段代码非常好奇 -

case AF_INET: 
    {
        struct sockaddr_in * tmp =
            reinterpret_cast<struct sockaddr_in *> (&addrStruct);
        tmp->sin_family = AF_INET;
        tmp->sin_port = htons(port);
        inet_pton(AF_INET, addr, tmp->sin_addr);
    }
    break;
Run Code Online (Sandbox Code Playgroud)

在提出这个问题之前,我已经搜索了关于同一主题的SO,并对此主题进行了混合回答.例如,看到这个,这个这个帖子说,使用这种代码在某种程度上是安全的.还有另一篇文章说使用工会来完成这样的任务,但是对接受的答案的评论再次提出不同意见.


微软关于相同结构的文档说 -

应用程序开发人员通常只使用SOCKADDR_STORAGE的ss_family成员.其余成员确保SOCKADDR_STORAGE可以包含IPv6或IPv4地址,并且适当填充结构以实现64位对齐.这种对齐使协议特定的套接字地址数据结构能够访问SOCKADDR_STORAGE结构中的字段而不会出现对齐问题.通过填充,SOCKADDR_STORAGE结构的长度为128个字节.

Opengroup的文件说明 -

标题应定义sockaddr_storage结构.该结构应为:

足够大以容纳所有支持的协议特定的地址结构

在适当的边界对齐,以便指向它的指针可以作为指向协议特定地址结构的指针,并用于访问这些结构的字段而没有对齐问题

socket的 man页面也说同样 -

此外,套接字API提供数据类型struct sockaddr_storage.此类型适用于容纳所有受支持的特定于域的套接字地址结构; 它足够大并且正确对齐.(特别是,它足以容纳IPv6套接字地址.)


我已经使用这两种类型转换看到多种实现CC++语言在野外,现在我不确定的事实,哪一个是正确的,因为有一些帖子说上述的权利要求相矛盾- 这个这个.

那么哪一个是填充sockaddr_storage结构的安全和正确的方法?这些指针转换是否安全?还是工会方法?我也知道这个getaddrinfo()电话,但对于刚刚填充结构的上述任务来说,这似乎有点复杂.memcpy还有另外一种推荐的方法,这样安全吗?

c c++ sockets linux strict-aliasing

14
推荐指数
2
解决办法
3178
查看次数

std :: string与以null结尾的字符串相比有多高效?

我发现std::string与老式的以null结尾的字符串相比,s非常慢,速度非常慢,以至于它们将整个程序的速度降低了2倍.

我预计STL会变慢,我没有意识到它会慢得多.

我正在使用Visual Studio 2008,发布模式.它显示字符串的char*赋值比赋值慢100-1000倍(测试char*赋值的运行时非常困难).我知道这不是一个公平的比较,指针赋值与字符串复制,但我的程序有很多字符串赋值,我不确定我可以在所有地方使用" const引用 "技巧.通过引用计数实现,我的程序可以很好,但这些实现似乎不再存在.

我真正的问题是:为什么人们不再使用引用计数实现,这是否意味着我们都需要更加谨慎地避免std :: string的常见性能缺陷?

我的完整代码如下.

#include <string>
#include <iostream>
#include <time.h>

using std::cout;

void stop()
{
}

int main(int argc, char* argv[])
{
    #define LIMIT 100000000
    clock_t start;
    std::string foo1 = "Hello there buddy";
    std::string foo2 = "Hello there buddy, yeah you too";
    std::string f;
    start = clock();
    for (int i=0; i < LIMIT; i++) {
        stop();
        f = foo1;
        foo1 = foo2;
        foo2 = f;
    }
    double …
Run Code Online (Sandbox Code Playgroud)

c++ performance stl

13
推荐指数
5
解决办法
2万
查看次数

如何复制流浪盒再次使用

本月我通过使用vagrant box add laravel/homestead下载了Homestead box thrid time.我目前无法访问快速互联网,因此每次下载都非常烦人.有没有办法再次使用下载的软件包并将本地软件包包含在vagrant中,如果保留项目或同步位置,则无关紧要.

如果重要的话,我在Ubuntu机器上.

更新:我需要下载的Homestead盒子,这样如果我的机器出现故障或者我必须在没有/慢速互联网连接的其他地方安装它,我可以在本地进行.

ubuntu vagrant laravel

10
推荐指数
2
解决办法
6826
查看次数

如何处理从不执行的代码

我有一些代码,看起来像这样,我不知道该如何处理,因为这代码的一部分,在无限循环运行,同时等待连接,当我终止程序,它从那里只有退出,这将永远不会得到执行的部分.

main(){

// do some stuff....

    while(1) {
        int newFD =
            accept(sockFD, (struct sockaddr *)&client_addr, &client_addr_size);
        if(newFD == -1) {
            std::cerr << "Error while Accepting on socket" << std::endl;
            continue;
        }

        if(!fork()) {

            close(sockFD); // close child's sockfd - not needed here

            // lalala do stuff send message here                

            close(newFD);  // finally close its newFD - message sent, no use 
            return 0;
        }
        close(newFD);  // close parent's newFD - no use here
    }

    // now execution never reaches here
    close(sockFD); …
Run Code Online (Sandbox Code Playgroud)

c++ linux networking loops infinite-loop

10
推荐指数
2
解决办法
1591
查看次数

在linux/sys/class/gpio中写入文件的错误

我现在有一个我曾经见过的最糟糕的bug系统,它似乎只有两种可能的解释 -

  • 附加sudo使文件写入即时
  • 或者追加sudo会在执行语句时产生短暂的延迟
  • 或者我不知道我的程序发生了什么

好吧,让我给你一些背景知识.我正在为raspberry pi gpio操作编写一个c ++程序.据我所知,程序中没有明显的错误,因为它成功地与sudo一起工作,并且也成功地延迟了.所以这里是rpi的gpio如何工作 -

  • 首先你要导出一个,保留它进行操作,它将创建一个新目录,gpio+number其中包含几个文件.

    echo 17 > /sys/class/gpio/export

  • 然后设置它的方向(在读取和退出意味着写入)

    echo "out" > /sys/class/gpio/gpio17/direction

  • 然后写入值(0或1表示关闭和打开)

    echo 1 > /sys/class/gpio/gpio17/value

  • 最后,将其取消导出,该目录将被删除.

    echo 17 > /sys/class/gpio/unexport

无论您是通过bash命令还是通过c/c ++或任何其他语言IO执行此操作都无关紧要,因为在unix中这些只是文件,您只需要读取/写入它们即可.到目前为止一切正常.我已经手动测试了它并且它可以工作,所以我的手动测试通过.


现在我为我的程序编写了一个简单的测试,看起来像这样 -

TEST(LEDWrites, LedDevice)
{
    Led led1(17, "MyLED");
    // auto b = sleep(1);
    EXPECT_EQ(true, led1.on());
}
Run Code Online (Sandbox Code Playgroud)

Led类constructor执行导出部分 - echo 17 > /sys/class/gpio/export.on()调用设置方向时 - echo "write" > /sys/class/gpio/gpio17/direction并输出值 - echo 1 > /sys/class/gpio/gpio17/value.忘掉这里的devport,因为它是由析构函数处理的,在这里不起作用.

如果你很好奇,这些函数会像这样处理I/O -

{
    const std::string direction = …
Run Code Online (Sandbox Code Playgroud)

c++ linux sudo file c++11

10
推荐指数
1
解决办法
1596
查看次数

如何使用0来设置匿名联合

我应该如何将匿名联盟归零?我在cppreference页面上找不到任何关于它的内容.将memset荷兰国际集团是最大的成员与0在这里工作?

例如 -

#include <iostream>
#include <cstring>

struct s{
    char a;
    char b[100];
};

int main(){
 union {
   int a;
   s b;
   char c;
 };

  // b.a = 'a'; (1)

  std::memset(&b, 0, sizeof(b));

  std::cout << a << "\n";
  std::cout << b.a << " " << b.b << "\n";
  std::cout << c << "\n";
}
Run Code Online (Sandbox Code Playgroud)

如果这样可行,我应该在使用memset()激活最大的成员之前取消注释(1)吗?

c++ initialization memset unions c++14

10
推荐指数
1
解决办法
1365
查看次数