小编Ton*_*nyK的帖子

为什么不在C++中强制执行2的补码?

新的C++标准仍然拒绝指定整数类型的二进制表示.这是因为C++的实际实现不使用2的补码算法吗?我觉得很难相信.是不是因为委员会担心硬件的未来发展会让"过时"的概念变得过时?再次难以置信.任何人都可以对此有所了解吗?

背景:我在一个评论帖中惊讶两次(Benjamin Lindley对这个问题的回答).首先,来自piotr的评论:

签名类型的右移是未定义的行为

其次,来自James Kanze的评论:

当分配给long时,如果该值不适合long,则结果是实现定义的

在我相信之前,我必须在标准中查看这些内容.它们的唯一原因是适应非二进制补码整数表示.为什么?

c++ binary standards

26
推荐指数
2
解决办法
3414
查看次数

64位C++中的sizeof(long)

我已经下载了MinGW-64,所以我现在可以使用g ++ 4.7.0(实验性)编译适用于Windows 7的64位程序.但是以下行:

cout << sizeof(long) << " " << sizeof(void*) << endl ;
Run Code Online (Sandbox Code Playgroud)

打印4 8,而不是8 8.g ++ 4.6.0的文档说:

64位环境将int设置为32位,将long设置为64位

有谁知道为什么sizeof(long)不是8?

编辑添加:我的困惑的来源是64位Windows的g ++ 4.7.0(还)是GNU编译器集合的官方部分.它是第一个带有32位的64位版本long,因此文档根本不适用于它.实际上,如果您访问相关网页,IA-32/x86-64的完整条目包括:

...

c++ 64-bit

19
推荐指数
2
解决办法
4万
查看次数

使用C++用户定义的文字初始化数组

我有一堆测试向量,以十六进制字符串的形式呈现:

MSG: 6BC1BEE22E409F96E93D7E117393172A
MAC: 070A16B46B4D4144F79BDD9DD04A287C
MSG: 6BC1BEE22E409F96E93D7E117393172AAE2D8A57
MAC: 7D85449EA6EA19C823A7BF78837DFADE
Run Code Online (Sandbox Code Playgroud)

我需要以某种方式将这些内容添加到C++程序中,而无需进行太多编辑.有各种选择:

  • 手动编辑测试向量到表单中 0x6B,0xC1,0xBE,...
  • 手动编辑测试向量到"6BC1BEE22E409F96E93D7E117393172A"形式,并编写一个函数,在运行时将其转换为字节数组.
  • 编写一个程序来解析测试向量并输出C++代码.

但我最终使用的是:

  • 用户定义的文字,

因为好玩.我定义了一个帮助器类HexByteArray和一个用户定义的文字运算符HexByteArray operator "" _$ (const char* s),它解析表单的字符串"0xXX...XX",其中XX...XX是偶数个十六进制数字.HexByteArray包括转换运算符const uint8_t*std::vector<uint8_t>.所以现在我可以写例如

struct {
  std::vector<uint8_t> MSG ;
  uint8_t* MAC ;
  } Test1 = {
  0x6BC1BEE22E409F96E93D7E117393172A_$,
  0x070A16B46B4D4144F79BDD9DD04A287C_$
  } ;
Run Code Online (Sandbox Code Playgroud)

哪个很好用.但现在我的问题是:我可以为阵列做这个吗?例如:

uint8_t MAC[16] = 0x070A16B46B4D4144F79BDD9DD04A287C_$ ;
Run Code Online (Sandbox Code Playgroud)

甚至

uint8_t MAC[] = 0x070A16B46B4D4144F79BDD9DD04A287C_$ ;
Run Code Online (Sandbox Code Playgroud)

我看不出如何做这项工作.要初始化一个数组,我似乎需要一个std::initializer_list.但据我所知,只有编译器可以实例化这样的东西.有任何想法吗?


这是我的代码:

HexByteArray.h

#include <cstdint>
#include <vector>

class HexByteArray
  {
public:
  HexByteArray …
Run Code Online (Sandbox Code Playgroud)

c++ initializer-list user-defined-literals

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

将Borland C++ Builder移植到Qt

我必须在Windows 7/mingw下使用g ++将一个项目从Windows XP下的Borland C++ Builder 5.0移植到Qt 4.7.1.库和命令行实用程序已经完成,现在我必须处理使用Borland VCL的GUI应用程序.
任何人都可以推荐任何工具或库来简化这项任务吗?
有没有人有这方面的经验?

编辑补充说:好吧,我采取了牛角,并从头开始实施GUI.我不得不说,评论员是对的:我看不出任何使用现有Borland GUI来简化流程的方法.

user-interface qt porting vcl c++builder

11
推荐指数
1
解决办法
4163
查看次数

初始化包含自身向量的结构

我有一个菜单系统,我想从常量数据初始化.A MenuItem可以包含作为子菜单的向量MenuItems.但它只能达到一定程度.以下是问题的根本原因:

#include <vector>
struct S { std::vector<S> v ; } ;

S s1 = { } ;
S s2 = { { } } ;
S s3 = { { { } } } ;
Run Code Online (Sandbox Code Playgroud)

g++ -std=c++0x(版本4.4.5)应对s1s2,但s3回来:

prog.cpp:6:22: error: template argument 1 is invalid
Run Code Online (Sandbox Code Playgroud)

(见ideone).难道我做错了什么?

c++ stl initializer-list incomplete-type c++11

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

传递对Variadic模板的引用

我正在研究一个事件库,我遇到了Variadic模板的问题.

一切都工作得非常好,除了我不能将参考作为参数传递...

这是一个非常简化的例子,用来揭露我的问题.

struct DelayedSignal 
{   
    ~DelayedSignal ()
    { std::cout << "~DelayedSignal CLOSE" << std::endl; }

    template<class C, class... Args>
    DelayedSignal ( void(C::*func)(Args...), C& obj )
    { std::cout << "DelayedSignal INIT - 03 - pointer to method & pointer to class instance (Arg num: " << sizeof...(Args) << ")" << std::endl; }

    template<class C, class... Args>
    DelayedSignal ( void(C::*func)(Args...), C& obj, Args... args )
    {
        std::cout << "DelayedSignal INIT - 04 - pointer to method & pointer to class instance …
Run Code Online (Sandbox Code Playgroud)

c++ templates variadic c++11

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

这是合法的C/C++吗?`int*p =(int []){1,2,3};`

我的这个答案产生了一些评论,声称以下构造不是合法的C/C++:

void f (int* a) ;
f ((int[]){1,2,3,4,0}) ;
Run Code Online (Sandbox Code Playgroud)

(请参阅完整程序的ideone链接).但我们无法解决这个问题.任何人都可以对此有所了解吗?各种标准有什么用?

c c++ arrays standards literals

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

负零的平方根

在g ++版本4.8.0(32位mingw)下,-0.0(二进制表示0x8000000000000000)的平方根为NAN.但是我可以发誓早期版本(我不确定哪个,但是我最后一次运行我的完整测试套件)只返回0.0,这对我来说似乎更明智.

这是正确的吗?C++标准中的某些内容是否已更改,或者这是一个g ++更改?

floating-point g++4.8

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

"此应用程序已请求运行时以不寻常的方式终止它."

我的Qt程序(g ++ 4.4.0)给了我Microsoft Visual C++运行时库错误"当我关闭它时,此应用程序已请求运行时以不寻常的方式终止它".但是当我在调试器中运行它时,我没有收到错误消息.有人知道如何获得有关崩溃的一些信息吗?消息框只有一个确定按钮.

编辑补充:按照Wimmel的建议,我附加了调试器.有两个线程处于活动状态,ThreadID为1和3.堆栈如下所示:

Level Function              File                           Line Address
0     VTagOutput            C:\Windows\syswow64\user32.dll 0    0x7529438d  
1     VTagOutput            C:\Windows\syswow64\user32.dll 0    0x7529438d  
2     USER32!EmptyClipboard C:\Windows\syswow64\user32.dll 0    0x752a2674  
3     ??                                                   0

Level Function                                    File                          Line Address
0     ntdll!LdrFindResource_U                     C:\Windows\SysWOW64\ntdll.dll 0   0x76f5000d  
1     ntdll!LdrSetAppCompatDllRedirectionCallback C:\Windows\SysWOW64\ntdll.dll 0   0x76fdfabe  
2     ??                                                                        0    0x7b9609b5 
3     ??                                                                        0
Run Code Online (Sandbox Code Playgroud)

也许第二个线程显示错误消息?第一个有点奇怪:前两行是相同的.我的代码中没有任何内容,TagOutput其名称也没有,据我所知,Qt也没有.

c++ qt

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

QTabBar下的小部件,带有不需要的帧

我有QTabBar/QTabWidget的问题.这是我的程序目前使用QTabBar的样子:

在此输入图像描述

如您所见,QTabBar与其下方的QScrollArea之间存在难看的线.这条线是QScrollArea框架的一部分,我不能简单地将其删除,因为在其他三个方面都需要它.我意识到我可以使用QTabWidget,但是我必须为每个选项卡创建一个小部件,这在这里是不可行的:QScrollArea的内容根据所选的选项卡而改变,但是只有一个QScrollArea小部件.(每次创建新选项卡时复制它都会导致问题.)

所以有人知道一种方法:
(i)告诉QScrollArea绘制没有顶线的框架; 或
(ii)为QTabWidget中的每个标签使用相同的小部件?

更新3对于另一种方法,请参阅下面的答案.

更新1我已经实现了zvezdi的建议,并且难看的线已经消失:

在此输入图像描述

这是一种改进.但这不对.查看滚动条和边框之间的间隙.在右边,它是两个像素而不是一个; 在底部,它是三个像素.QScrollArea边框和mainWidget边框之间的右边间隙是一个像素太大.这是由于QTabWidget的边框风格,我正在试图改变我的理智.如果我说:

MyTabWidget -> setStyleSheet ("QTabWidget::pane { margin: 0px,0px,0px,0px }") ;
Run Code Online (Sandbox Code Playgroud)

边缘似乎是正确的,但边界消失了:

在此输入图像描述

如果我说:

MyTabWidget -> setStyleSheet ("QTabWidget::pane { "
  " margin: 0px,0px,0px,0px;"
  " border: 1px solid darkgray;"
  "}") ;
Run Code Online (Sandbox Code Playgroud)

然后我几乎回到了我开始的地方:

在此输入图像描述

如果我尝试用以下方法解决这个问题:

ApplicationTabWidget -> setStyleSheet ("QTabWidget::pane { "
"   margin: 0px,0px,0px,0px;"
" border: 1px solid darkgray;"
" border-top: 0px;"
      "}") ;
Run Code Online (Sandbox Code Playgroud)

然后我再次为自己的痛苦而嘲笑:

在此输入图像描述

更新2如果我忘记setStyleSheet并打开documentMode,这就是我得到的:

在此输入图像描述

请有人,告诉我,我是愚蠢的,这是一个非常简单的解决方案.

c++ qt qt4

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