小编use*_*840的帖子

如果char被签名,"char foo = 255"是否定义了未定义的行为?

在使用Linux的x86机器上使用gcc 4.5.2编译时,以下内容不会给我任何警告:

char foo = 255;
Run Code Online (Sandbox Code Playgroud)

但是当我使用时-pedantic,gcc说:

警告:隐式常量转换溢出

gcc行为的方式有点奇怪,这让我怀疑我是否真的理解这项任务中发生了什么.我认为如果charPOSIX上有8位长并且默认情况下是签名,则无法保持255.

在C标准中,它表示无符号整数溢出导致溢出,但未定义有符号整数溢出.这个赋值是不确定的行为?为什么gcc这样做?

c gcc

39
推荐指数
3
解决办法
1770
查看次数

为什么在x86_64 ABI中选择地址0x400000作为文本段的开头?

文件中.27它说文本段从0x400000开始.为什么选择这个特定的地址?有什么理由吗?相同的地址被选择在GNU ldLinux:

$ ld -verbose | grep -i text-segment
  PROVIDE (__executable_start = SEGMENT_START("text-segment", 0x400000)); . = SEGMENT_START("text-segment", 0x400000) + SIZEOF_HEADERS;
Run Code Online (Sandbox Code Playgroud)

这是令人惊讶的,因为这个地址在32位x86可执行文件中更大:

$ ld -verbose | grep -i text-segment
  PROVIDE (__executable_start = SEGMENT_START("text-segment", 0x08048000)); . = SEGMENT_START("text-segment", 0x08048000) + SIZEOF_HEADERS;
Run Code Online (Sandbox Code Playgroud)

我读了这个问题,讨论为什么为i386选择了0x080xxxxx地址,但它没有解释x86_64的变化.在这个问题上很难找到任何解释.有人有线索吗?

linux memory x86-64 elf abi

32
推荐指数
1
解决办法
2259
查看次数

如何在Python curses中创建菜单和子菜单?

AFAIK,Python中没有可用的curses菜单扩展,所以你必须推出自己的解决方案.我知道这个补丁http://bugs.python.org/issue1723038,但我不知道它的当前状态.我找到了一个很好的Python类,在http://www.promisc.org/blog/?p=33包含了我想要的'cmenu',但我也遇到了问题.我想创建一个菜单,用户可以选择一个突出显示的元素,但不是立即执行特定的操作,我想显示另一个菜单,然后可能是另一个,请求输入等.我的第一个想法是删除现有的cmenu screen.clear()或cleanup()但是在绘制新菜单之前不会删除旧菜单,新菜单如下所示:

    0. top
    1. Exit
    2. Another menu
-- end of the old menu that should go away --
    3. first
    4. second
    5. third
Run Code Online (Sandbox Code Playgroud)

没有用于删除cmenu()中项目的remove()方法.我想旧的菜单没有被清除的事实是由display()方法中的'while True'循环引起的,但是当我删除它时,一些奇怪的东西正在发生.我使用的是Python 2.7,这是我目前的代码:

#!/usr/bin/python
#
# Adapted from:
# http://blog.skeltonnetworks.com/2010/03/python-curses-custom-menu/
#
# Goncalo Gomes
# http://promisc.org
#

import signal
signal.signal(signal.SIGINT, signal.SIG_IGN)

import os
import sys
import curses
import traceback
import atexit
import time

import sys
reload(sys)
sys.setdefaultencoding("utf-8")

class cmenu(object):
    datum = {}
    ordered = []
    pos = 0

    def __init__(self, …
Run Code Online (Sandbox Code Playgroud)

python curses python-2.7

16
推荐指数
1
解决办法
3万
查看次数

字节流和比特流之间的差异

到目前为止,我认为它们与由字节组成的字节相同,并且双方需要知道另一侧的字节大小和端点并相应地转换流.然而,维基百科说byte stream!= bit stream(https://en.wikipedia.org/wiki/Byte_stream)并且bit streams专门用于视频编码(https://en.wikipedia.org/wiki/Bitstream_format).在这个RFC https://tools.ietf.org/html/rfc107中,他们讨论了这两件事并进行了描述Two separate kinds of inefficiency arose from bit streams..我的问题是:

  • 字节流和比特流之间的真正区别是什么?
  • 比特流如何与字节流不同?接收方如何知道在给定时间要处理多少位?
  • 为什么在某些情况下比特流比字节流更好?

streaming byte bits bytestream

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

在C中,stdout缓冲区的大小是多少?

今天我了解到,当stdout设置为终端并在不同情况下进行缓冲时,它是行缓冲的.因此,在正常情况下,如果我使用printf()而不使用终止'\n',则仅当缓冲区已满时才会在屏幕上打印.如何获得这个缓冲区的大小,这有多大?

c unix linux

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

将master合并到每个主机自定义分支时避免合并冲突

我想将所有的dotfiles git存储在存储库中,每个机器都有单独的分支.我有一个问题我无法解决阻止我使用git它的目的.我想知道其他人是如何解决它的.

我将有一个单独的master分支,其中只包含模板定义和定义,这些定义和定义应该对所有分支都是通用的,例如:

export EMAIL="@EMAIL@"
export SURFRAW_google_results=1000
Run Code Online (Sandbox Code Playgroud)

我将用@EMAIL@机器分支上的正确电子邮件替换并提交它但SURFRAW_google_results保持不变.例如,在work分支上我会有这样的:

export EMAIL="user@corp.com"
export SURFRAW_google_results=1000
Run Code Online (Sandbox Code Playgroud)

现在,我决定改为SURFRAW_google_results=100010.它应该在全球范围内共享,所以我首先要改变它master:

export EMAIL="@EMAIL@"
export SURFRAW_google_results=10
Run Code Online (Sandbox Code Playgroud)

然后在我的基础workmaster:

$ git checkout work
$ git rebase master
Run Code Online (Sandbox Code Playgroud)

现在我遇到了冲突,因为我改变的线上方的线是不同的:

<<<<<<< a60114eea1c98d2354a07bd4fd0cdd63cba62e93
export EMAIL="@EMAIL@"
export SURFRAW_google_results=10
=======
export EMAIL="user@corp.com"
export SURFRAW_google_results=1000
>>>>>>> m
Run Code Online (Sandbox Code Playgroud)

如果bash我可以迅速通过采购机制包括机器特定的部分,但不支持包括/采购其他配置,如.fluxbox/keys.screenrc

git dotfiles

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

为什么gdb在从函数返回时停在与"i b"不同的行?

这是我试图调试的程序:

#include <stdio.h>
int i = 5;

int main(void)
{
    int x = 3;

    display(x);
    return 0;
}


void display(int x)
{
for ( i=0; i<x; ++i ) {
    printf("i is %d.\n", i);
}
}
Run Code Online (Sandbox Code Playgroud)

此代码来自http://www.dirac.org/linux/gdb/05-Stepping_And_Resuming.php#breakpointsandwatchpoints.这是问题所在:

(gdb) break display 
Breakpoint 1 at 0x40051e: file try5.c, line 15.
(gdb) run
Starting program: /home/ja/gdb/learning/try5 

Breakpoint 1, display (x=3) at try5.c:15
(gdb) frame 1
#1  0x000000000040050c in main () at try5.c:8
(gdb) break 
Breakpoint 2 at 0x40050c: file try5.c, line 8. …
Run Code Online (Sandbox Code Playgroud)

c unix linux debugging gdb

7
推荐指数
1
解决办法
1408
查看次数

为什么clang和gcc只有在反斜杠后有空格时才会发出警告,如果C标准说禁止空格?

编译以下代码段时,gcc和clang都只发出警告.注意\下一个后面的空格int:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int \ 
        a = 10;

    printf("%d\n", a);
}
Run Code Online (Sandbox Code Playgroud)

GCC:

main.c:7:6:警告:反斜杠和换行符以空格分隔[默认启用]

铛:

main.c:7:7:警告:反斜杠和换行符以空格分隔int ^

在5.1.1.2的c99标准中,它说:

删除反斜杠字符()后面紧跟一个新行字符的每个实例,拼接物理源代码行以形成逻辑源代码行.

为什么C编译器不符合C标准?我认为只有他们的创作者决定不这样做.我在gcc邮件列表上发现了一条消息,我认为这引起了这种行为:http://gcc.gnu.org/ml/gcc-patches/2000-09/msg00430.html.在那里,他们说这是完成的,因为尾随空格是常见的,他们不想将它们视为错误.这有多常见?

c standards gcc clang backslash

6
推荐指数
1
解决办法
1133
查看次数

分配页面对齐的内存块有什么好处?

我意识到大多数CPU更擅长在对齐的内存地址读取数据,即内存地址是CPU字的倍数.但是,在很多地方我都读过有关分配页面对齐内存的内容.为什么有人想要获得页面对齐的内存地址?它只是为了更大的表现吗?

c cpu memory-management alignment

6
推荐指数
1
解决办法
3712
查看次数

“rebase”导致的冲突数量是否比“merge”少?

我不时偶然发现“git rebase”导致的冲突数量少于“git merge”的说法,例如这里:为什么 git rebase 通常比合并有更少的合并冲突?. 这是否意味着可能git-merge <BRANCH_A> <BRANCH_B>会出现失败的情况,我会做git reset --hard ORIG_HEAD,然后做,然后git-rebase <BRANCH_B> <BRANCH_A>会成功?你能举一个这种情况的例子吗?

git git-merge git-rebase

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