新的C++标准仍然拒绝指定整数类型的二进制表示.这是因为C++的实际实现不使用2的补码算法吗?我觉得很难相信.是不是因为委员会担心硬件的未来发展会让"过时"的概念变得过时?再次难以置信.任何人都可以对此有所了解吗?
背景:我在一个评论帖中惊讶两次(Benjamin Lindley对这个问题的回答).首先,来自piotr的评论:
签名类型的右移是未定义的行为
其次,来自James Kanze的评论:
当分配给long时,如果该值不适合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的完整条目包括:
...
我有一堆测试向量,以十六进制字符串的形式呈现:
MSG: 6BC1BEE22E409F96E93D7E117393172A
MAC: 070A16B46B4D4144F79BDD9DD04A287C
MSG: 6BC1BEE22E409F96E93D7E117393172AAE2D8A57
MAC: 7D85449EA6EA19C823A7BF78837DFADE
Run Code Online (Sandbox Code Playgroud)
我需要以某种方式将这些内容添加到C++程序中,而无需进行太多编辑.有各种选择:
0x6B,0xC1,0xBE,...但我最终使用的是:
因为好玩.我定义了一个帮助器类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) 我必须在Windows 7/mingw下使用g ++将一个项目从Windows XP下的Borland C++ Builder 5.0移植到Qt 4.7.1.库和命令行实用程序已经完成,现在我必须处理使用Borland VCL的GUI应用程序.
任何人都可以推荐任何工具或库来简化这项任务吗?
有没有人有这方面的经验?
编辑补充说:好吧,我采取了牛角,并从头开始实施GUI.我不得不说,评论员是对的:我看不出任何使用现有Borland GUI来简化流程的方法.
我有一个菜单系统,我想从常量数据初始化.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)应对s1和s2,但s3回来:
prog.cpp:6:22: error: template argument 1 is invalid
Run Code Online (Sandbox Code Playgroud)
(见ideone).难道我做错了什么?
我正在研究一个事件库,我遇到了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/C++:
void f (int* a) ;
f ((int[]){1,2,3,4,0}) ;
Run Code Online (Sandbox Code Playgroud)
在g ++版本4.8.0(32位mingw)下,-0.0(二进制表示0x8000000000000000)的平方根为NAN.但是我可以发誓早期版本(我不确定哪个,但是我最后一次运行我的完整测试套件)只返回0.0,这对我来说似乎更明智.
这是正确的吗?C++标准中的某些内容是否已更改,或者这是一个g ++更改?
我的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也没有.
我有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,这就是我得到的:

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