C++ 11为我们如何处理枚举引入了两个不同的补充:一个使它们成为范围的选项,以及一个使它们键入的选项.所以现在我们有四种不同的枚举子类型:
enum Old {};
enum Typed : int8_t {};
enum class Scoped {};
enum class TypedScoped : int8_t {};
Run Code Online (Sandbox Code Playgroud)
这个问题询问如何确定枚举是否作用域.我想知道如何确定是否键入枚举.
附加信息
我使用Qt框架,它提供了QDataStream以便携式跨平台方式序列化/反序列化数据的类.显然,为了使结果数据流可移植,您必须以固定长度的形式存储所有整数.这也包括枚举.回到当天,我制作了几个辅助宏来定义枚举的序列化/反序列化,方法是将它们转换为具有固定(用户指定)长度的整数:
#define SC_DECLARE_DATASTREAM_WRITE_OPERATOR(_TYPE) \
QDataStream &operator<<(QDataStream &stream, _TYPE v);
#define SC_DECLARE_DATASTREAM_READ_OPERATOR(_TYPE) \
QDataStream &operator>>(QDataStream &stream, _TYPE &v);
#define SC_DECLARE_DATASTREAM_OPERATORS(_TYPE) \
SC_DECLARE_DATASTREAM_WRITE_OPERATOR(_TYPE) \
SC_DECLARE_DATASTREAM_READ_OPERATOR(_TYPE)
#define SC_DEFINE_DATASTREAM_ENUM_WRITE_OPERATOR(_TYPE, _LEN) \
QDataStream &operator<<(QDataStream &stream, _TYPE v) \
{ \
qint ## _LEN t = v; \
static_assert(sizeof(t) >= sizeof(v), "Increase length"); \
stream << t; \
return …Run Code Online (Sandbox Code Playgroud) 这是我的问题:我有一个闭源的第三方Win32应用程序,它通过命名管道充当其他程序的服务器,即它希望它的客户端像这样做:
HANDLE h = CreateFile("\\\\.\\pipe\\$pipe_name$", GENERIC_READ | GENERIC_WRITE, etc...);
// ...
TransactNamedPipe(h, buf, etc...);
// ...
CloseHandle(h);
Run Code Online (Sandbox Code Playgroud)
此应用程序在WINE中运行完美,除了我无法与之通信.所以这是我的问题:
当要求打开烟斗时,WINE究竟做了什么?比方说,它是否将它映射到〜/ .wine /或其中的某个FIFO文件?有没有办法从Linux应用程序与这样的程序进行通信?谷歌对此一无所知.
谢谢.
以下是Qt文档的引用:
某些资源需要根据用户的语言环境进行更改,例如翻译文件或图标.这是通过向qresource标记添加lang属性,指定合适的区域设置字符串来完成的.例如:
Run Code Online (Sandbox Code Playgroud)<qresource> <file>cut.jpg</file> </qresource> <qresource lang="fr"> <file alias="cut.jpg">cut_fr.jpg</file> </qresource>如果用户的语言环境是法语(即QLocale :: system().name()返回"fr_FR"),则:/ cut.jpg将成为对cut_fr.jpg图像的引用.对于其他语言环境,使用cut.jpg.
我试着这样做但我失败了.这是我的*.qrc文件的一部分:
<qresource>
<file>HtmlTemplates/angle.html</file>
<file>HtmlTemplates/bottom.html</file>
<file>HtmlTemplates/top.html</file>
</qresource>
<qresource lang="en">
<file alias="HtmlTemplates/angle.html">HtmlTemplates/en/angle.html</file>
<file alias="HtmlTemplates/bottom.html">HtmlTemplates/en/bottom.html</file>
<file alias="HtmlTemplates/top.html">HtmlTemplates/en/top.html</file>
</qresource>
Run Code Online (Sandbox Code Playgroud)
如您所见,它遵循与手册中的示例完全相同的模式.但是,尝试编译此文件会产生以下结果:
..\Blinky_2.0\resources.qrc: Warning: potential duplicate alias detected: 'angle.html'
..\Blinky_2.0\resources.qrc: Warning: potential duplicate alias detected: 'bottom.html'
..\Blinky_2.0\resources.qrc: Warning: potential duplicate alias detected: 'top.html'
Run Code Online (Sandbox Code Playgroud)
如果我尝试修改QtCreator中的*.qrc文件,它会将其重置为错误状态,删除lang属性:
<qresource prefix="/">
<file>HtmlTemplates/angle.html</file>
<file>HtmlTemplates/bottom.html</file>
<file>HtmlTemplates/top.html</file>
<file alias="HtmlTemplates/angle.html">HtmlTemplates/en/angle.html</file>
<file alias="HtmlTemplates/bottom.html">HtmlTemplates/en/bottom.html</file>
<file alias="HtmlTemplates/top.html">HtmlTemplates/en/top.html</file>
</qresource>
Run Code Online (Sandbox Code Playgroud)
所以我被迫在我的代码中迭代不同语言环境的资源.我错过了什么或这是一个Qt错误?Qt版本是4.8.4,QtCreator版本是2.8.1.
我知道您需要重新实现 QApplication::notify() 方法才能正确捕获从主线程的事件处理程序抛出的异常。但是其他线程呢?假设我有一个带有槽的对象,并且该对象位于 QThread 中(具有默认的 run() 方法,该方法仅调用 exec()),即该对象的线程关联性是后台 QThread。那么,我应该在哪里捕获从该对象的槽抛出的异常呢?
IOW,如何重新实现后台线程的notify()方法?
我有一些重要的数据,是几十年前由一个古老的 16 位 DOS 应用程序编写的。没有文档,没有来源,也没有关于作者的信息。只是 16 位 exe。我想我是时候学习如何反编译东西了,因为这似乎是恢复文件格式的唯一方法。我尝试过 OllyDbg,它看起来确实很棒,但它不能 16 位。
那么,是否有反汇编器/调试器能够处理此类可执行文件?谢谢。
UPD:我知道 DOSbox,应用程序可以在其中运行。问题是,我不需要运行它,我需要了解它写入数据的文件格式。或者也许我对 DOSbox 不了解,它也可以作为调试器/反编译器运行?或者你的意思是在 DOSbox 中启动一些旧的 16 位 DOS 调试器/反编译器?后者听起来像是一个想法,但是您能说出一个像样的 DOS 调试器吗?
我正在尝试使用new decltype关键字将一些代码移动到模板,但是当与解除引用的指针一起使用时,它会生成引用类型.SSCCE:
#include <iostream>
int main() {
int a = 42;
int *p = &a;
std::cout << std::numeric_limits<decltype(a)>::max() << '\n';
std::cout << std::numeric_limits<decltype(*p)>::max() << '\n';
}
Run Code Online (Sandbox Code Playgroud)
第一个numeric_limits工作,但第二个抛出value-initialization of reference type 'int&'编译错误.如何从指向该类型的指针获取值类型?
Qt信号/插槽系统摇摇欲坠,但看起来它缺少一些真正有用的功能(或者至少我找不到如何使用它)。我有一个带有很多信号的类,而这个类的类switch需要根据变量的值发出适当的信号。现在,我使用C预处理器解决此问题:
#define CASE(_NAME) \
case MyEnum_ ## _NAME: \
{ \
emit MySignal_ ## _NAME(); \
do_other_stuff(); \
break; \
}
switch(val)
{
CASE(Val_1)
CASE(Val_2)
CASE(Val_3)
}
Run Code Online (Sandbox Code Playgroud)
这看起来不正确。我敢肯定有一种更优雅的方法。QMetaObject有一种indexOfSignal方法,可以使用带有名称的字符串为我提供信号的Qt内部ID。如果我可以使用该ID发出信号,我的代码将变得更加清晰。
我已经窥视了由生成的信号方法实现moc,看起来唯一一个与另一个信号不同的是一位数字:
void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) };
QMetaObject::activate(this, &staticMetaObject, <signal_id>, _a);
Run Code Online (Sandbox Code Playgroud)
其中<signal_id>,每个信号的唯一整数。
所以,问题是,我该怎么办emit(int signalIdx)?还是至少有机会致电QMetaObject::activate,因为它看上去埋在专用标头中?
c++ ×5
qt ×3
c++11 ×2
qt4 ×2
debugging ×1
decltype ×1
decompiler ×1
decompiling ×1
disassembly ×1
enums ×1
exception ×1
named-pipes ×1
qmetaobject ×1
qt-signals ×1
rcc ×1
reference ×1
type-traits ×1
wine ×1