小编Lon*_*ner的帖子

直接列表初始化和复制列表初始化之间的差异

我想知道std::vectorC++ 11及更高版本中的以下两种初始化是否有任何区别.

std::vector<int> v1 {1, 2, 3, 4, 5};
std::vector<int> v2 = {1, 2, 3, 4, 5};
Run Code Online (Sandbox Code Playgroud)

这是一个完整的代码示例,工作正常.

#include <iostream>
#include <vector>

int main()
{
    std::vector<int> v1 {1, 2, 3, 4, 5};
    std::vector<int> v2 = {1, 2, 3, 4, 5};

    std::cout << v1.size() << '\n';
    std::cout << v2.size() << '\n';
}
Run Code Online (Sandbox Code Playgroud)

我看到两个初始化都会导致相同的结果.

http://en.cppreference.com/w/cpp/container/vector上的示例使用第二种,这让我想到这种初始化是否有任何优势.

一般来说,我想知道一个初始化是否具有相对于另一个的特定技术优势,或者如果一个初始化被认为是最佳实践而另一个不是,如果是,为什么.

特别是,我关心的是复制列表初始化是否由于临时对象和复制而产生额外的开销?

c++ initialization c++11 c++14 c++17

11
推荐指数
2
解决办法
433
查看次数

允许枚举的标识符有什么意义?

当我尝试将不正确的值分配给a类型变量时,为什么编译器不抱怨enum answer

#include <stdio.h>

int main()
{
    enum answer {NO, YES};
    enum gender {MALE, FEMALE};

    enum answer a = 5; /* Assign an invalid value. */
    printf("answer: %d\n", a);

    a = MALE; /* Assign a value of wrong type */
    printf("answer: %d\n", a);

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

这是输出:

$ gcc -std=c99 -pedantic -Wall -Wextra enum.c 
$ ./a.out
answer: 5
answer: 0
Run Code Online (Sandbox Code Playgroud)

如果enum不导致类型检查,那么将语法设置为:

enum [identifier] {enumerator-list}
Run Code Online (Sandbox Code Playgroud)

我使用answergender作为我的枚举的标识符.允许这种语法有什么意义?

我的意思是这段代码写得非常好

enum {NO, YES};
enum …
Run Code Online (Sandbox Code Playgroud)

c enums

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

当PuTTY终端设置为使用UTF-8时,gdb --tui无法使用正确的行显示边框

问题

我使用PuTTY登录远程CentOS系统,并使用g ++和gdb进行开发.我的PuTTY设置为将终端输出解释为UTF-8并相应地渲染它.此设置配置如下.

在此输入图像描述

在调试时gdb --tui我发现源代码窗格周围的边框没有用线条正确绘制.它看起来像终端字符编码问题.

终端能够正确显示Unicode字符.以下是一些示例输出:

[root@gel ~]# python -c "print u'\u2665'"
?
[root@gel ~]# printf "\xe2\x99\xa5\n"
?
Run Code Online (Sandbox Code Playgroud)

这是我的终端设置:

[root@gel ~]# echo $LANG
en_US.UTF-8
[root@gel ~]# echo $LC_CTYPE

[root@gel ~]# locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
[root@gel ~]# echo $TERM
xterm
Run Code Online (Sandbox Code Playgroud)

然而,当我启动gdb -tui

   lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk
   x                                                                           x
   x                                                                           x
   x                                                                           x
   x                                                                           x
   x                                                                           x
   x                                                                           x
   x             [ No Source Available ]                                       x
   x                                                                           x
   x                                                                           x …
Run Code Online (Sandbox Code Playgroud)

putty gdb character-encoding

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

如何查找C结构的手册页(struct sockaddr_in)?

我很难找到插座中使用的结构的手册页.所以我目前正在通过单独的在线教程了解它们.但是知道如何在手册页中查找这些结构会很好.

我使用的是Debian 8.3 Linux系统.

例如,我发现有关信息struct addrinfoman getaddrinfo.

但我无法struct sockaddr_in在任何手册页中找到相关信息.哪个手册页包含有关此结构的详细信息?如何找到一般这类结构的手册页?

c linux struct manpage

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

如何在Mac上找到实际的Clang版本?

注意:“ 获取Apple clang版本”和相应的上游LLVM版本提供的答案似乎都不再起作用。

http://releases.llvm.org/download.html上的下载页面和https://en.wikipedia.org/wiki/Clang上的Wikipedia文章似乎表明最新的Clang版本是6.0.0。

但是在我的macOS High Sierra版本10.13.3上,我看到以下输出:

$ clang --version
Apple LLVM version 9.1.0 (clang-902.0.39.1)
Target: x86_64-apple-darwin17.4.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
$ which clang
/usr/bin/clang
Run Code Online (Sandbox Code Playgroud)

这似乎不正确。为什么Apple的Clang版本大于当前的Clang版本?

我如何找出http://releases.llvm.org/download.html上托管的Clang版本与Mac的Clang版本相对应?

我问这个,因为我看到http://releases.llvm.org/6.0.0/tools/clang/docs/UsersManual.html记录一-pedantic对选项clang的命令行,但不是在手册页记录clang我的系统上。

$ man clang | grep pedantic
$ clang --help | grep pedantic
$
Run Code Online (Sandbox Code Playgroud)

c c++ macos version clang

10
推荐指数
3
解决办法
5746
查看次数

设置为 CHAR_MAX 的字符值是否保证环绕到 CHAR_MIN?

我的代码:

#include <stdio.h>
#include <limits.h>

int main()
{
    char c = CHAR_MAX;
    c += 1;
    printf("CHAR_MIN=%d CHAR_MAX=%d c=%d (%c)\n", CHAR_MIN, CHAR_MAX, c, c);
}
Run Code Online (Sandbox Code Playgroud)

输出:

CHAR_MIN=-128 CHAR_MAX=127 c=-128 ()
Run Code Online (Sandbox Code Playgroud)

我们看到,当我们增加一个char设置为的变量时CHAR_MAX,它会环绕到CHAR_MIN。这种行为有保证吗?或者它将是未定义的行为或实现指定的行为?C99 标准对此有何评论?

[注意:将大于 CHAR_MAX (127) 的值赋予 charC会发生什么-为什么 char c=129 会转换为 -127?没有解决这个问题,因为他们谈论分配一个超出范围的值而不是将一个值增加到一个超出范围的值。]

c standards integer-overflow char language-lawyer

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

`uwsgi_modifier1 30`指令没有像记录的那样从PATH_INFO中删除SCRIPT_NAME

这是我的nginx虚拟主机配置.

debian:~# cat /etc/nginx/sites-enabled/mybox
server {
    listen 8080;
    root /www;
    index index.html index.htm;
    server_name mybox;
    location /foo {
        uwsgi_pass unix:/tmp/uwsgi.sock;
        include uwsgi_params;
        uwsgi_param SCRIPT_NAME /foo;
        uwsgi_modifier1 30;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的WSGI应用程序的源代码.

debian:~# cat /www/app.py
def application(environ, start_response):
    path_info = script_name = request_uri = None

    if 'PATH_INFO' in environ:
        path_info = environ['PATH_INFO']

    if 'SCRIPT_NAME' in environ:
        script_name = environ['SCRIPT_NAME']

    if 'REQUEST_URI' in environ:
        request_uri = environ['REQUEST_URI']

    output = 'PATH_INFO: ' + repr(path_info) + '\n' + \
             'SCRIPT_NAME: ' + repr(script_name) + '\n' …
Run Code Online (Sandbox Code Playgroud)

python wsgi nginx uwsgi

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

为什么具有listen(sockfd,2)的服务器能够接受3个连接?

我试图了解backlog参数int listen(int sockfd, int backlog);如何影响新连接的处理方式.

这是我的服务器程序.

/* server.c */
#include <stdio.h>
#include <string.h>
#include <unistd.h>

#include <sys/socket.h>
#include <arpa/inet.h>
#include <netdb.h>

int main()
{
    int sockfd;
    int ret;
    int yes = 1;

    struct addrinfo hints, *ai;

    memset(&hints, 0, sizeof hints);
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_flags = AI_PASSIVE;

    if ((ret = getaddrinfo(NULL, "8000", &hints, &ai)) == -1) {
        fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(ret));
        return 1;
    }

    sockfd = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
    if (sockfd == -1) { …
Run Code Online (Sandbox Code Playgroud)

c sockets linux connection

9
推荐指数
3
解决办法
797
查看次数

为什么对内存映射零字节文件的读操作会导致SIGBUS?

这是我写的示例代码.

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>

int main()
{
    int fd;
    long pagesize;
    char *data;

    if ((fd = open("foo.txt", O_RDONLY)) == -1) {
        perror("open");
        return 1;
    }

    pagesize = sysconf(_SC_PAGESIZE);
    printf("pagesize: %ld\n", pagesize);

    data = mmap(NULL, pagesize, PROT_READ, MAP_SHARED, fd, 0);
    printf("data: %p\n", data);
    if (data == (void *) -1) {
        perror("mmap");
        return 1;
    }

    printf("%d\n", data[0]);
    printf("%d\n", data[1]);
    printf("%d\n", data[2]);
    printf("%d\n", data[4096]);
    printf("%d\n", data[4097]);
    printf("%d\n", data[4098]);

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

如果我向该程序提供零字节foo.txt,它将以SIGBUS终止.

$ > foo.txt && …
Run Code Online (Sandbox Code Playgroud)

c mmap sigbus

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

没有'-it'运行容器时,只出现一行SimpleHTTPServer输出

注意:我不是要在这里解决实际项目中的任何问题.这个问题仅用于理解我在下面第二个实验(实验2)中看到的结果背后的原因.

这些实验使用Docker版本17.12.0-ce在macOS Terminal版本2.8上的macOS High Sierra 10.13.1上进行.

实验1:docker run带有-it选项的SimpleHTTPServer

这是我的Dockerfile:

FROM python:2.7-slim
CMD ["python", "-m", "SimpleHTTPServer"]
Run Code Online (Sandbox Code Playgroud)

我构建它并使用此命令运行它:

docker build -t pyhttp .
docker run -it -p 8000:8000 pyhttp
Run Code Online (Sandbox Code Playgroud)

在另一个终端中,我使用以下命令测试容器:

curl http://localhost:8000/
Run Code Online (Sandbox Code Playgroud)

curl命令产生预期结果:目录列表.在终端运行中docker run,我看到了这个预期的输出.

$ docker run -it -p 8000:8000 pyhttp
Serving HTTP on 0.0.0.0 port 8000 ...
172.17.0.1 - - [04/Feb/2018 10:07:33] "GET / HTTP/1.1" 200 -
Run Code Online (Sandbox Code Playgroud)

最后,按Ctrl+键停止此docker容器C.

实验2:docker run没有-it选项的SimpleHTTPServer

现在我pyhttp用这个命令运行相同的图像: …

python httpserver docker

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