好吧,我知道标准规定C++实现可以选择评估函数的哪个顺序参数,但是在实际影响程序的情况下是否有任何实现"利用"它的实现?
经典示例:
int i = 0;
foo(i++, i++);
Run Code Online (Sandbox Code Playgroud)
注意:我不是在找人告诉我评估的顺序不能依赖,我很清楚这一点.我只对任何编译器是否真的按照从左到右的顺序进行评估感兴趣,因为我的猜测是,如果他们做了很多写得不好的代码就会破坏(这是正确的,但他们仍然可能会抱怨).
我目前正在使用aligned_storage来实现类似于boost :: optional的'Optional'类型.要做到这一点,我有一个类成员,如下所示:
typename std::aligned_storage<sizeof(T), std::alignment_of<T>::value>::type t_;
Run Code Online (Sandbox Code Playgroud)
我使用placement new来创建对象,但是我不存储返回任何地方的指针.相反,我在所有我的成员函数中访问对象的基础类型(显然通过检查确保对象通过也存储在我的Optional类型中的布尔标志有效):
T const* operator->() const {
return static_cast<T const*>(static_cast<void const*>(&t_));
}
Run Code Online (Sandbox Code Playgroud)
我的问题是这是否安全.我的理解是我对placement new的使用改变了对象的'动态类型',只要我继续使用该类型访问内存,我就没问题.但是我不清楚我是否必须保持从placement new返回的指针,或者我是否只允许在需要访问它时转换为底层类型.我已经阅读了C++ 11标准的第3.10节,但是我在标准方面还不够流利,无法确定.
如果可能的话,如果你能在答案中提到标准,我会感觉更好(这有助于我在晚上睡觉:P).
c++ strict-aliasing undefined-behavior language-lawyer type-punning
就个人而言,我非常喜欢仅限标题的库,但有人声称它们会因为过度内联而导致代码膨胀(以及编译时间较长的另一个明显问题).
我在想,这些说法有多少真相(关于臃肿的说法)?
此外,成本是否合理?(显然有一些不可避免的情况,例如它是纯粹或大部分使用模板实现的库,但是我对实际可用的选项更感兴趣.)
我知道就这样的事情而言,没有严格的规则,准则等,但我只是想了解别人对这个问题的看法.
PS是的,这是一个非常模糊和主观的问题,我知道,因此我已将其标记为此类.
我正在编写一个C++内存编辑库,对于读/写API,我使用类型特征(std :: is_pod,std :: is_same)和boost :: enable_if来提供3个重载:
重载2和3只是在重载1周围的'包装器'.(因此,如果你正在读取std :: vector或std :: basic_string而T不是POD,它将失败,因为它应该.)
最近我想使用std :: array进行一堆读写操作,因为我知道我想在编译时读写的数据大小(我正在编写一个围绕PE文件格式的包装器).
我编写了使用std :: array的代码,然后打算为std :: array类型的检测和处理添加另一个重载,但是我不小心遇到了编译,令我惊讶的是它工作了!
我目前正在使用MSVC 10,事实证明,对于std :: array,如果T是POD,则std :: array是POD.(这意味着我可以使用重载1并且它可以工作.)
我的问题是这是由C++标准保证还是由实现完成.
我知道我可以自己检查标准,但我不相信自己,因为我相信这个网站上的一些语言律师,所以我认为最好得到"第二意见".;)
谢谢
此处提供的PS代码(它是一个仅限标题的lib):http: //code.google.com/p/hadesmem/source/browse/trunk/HadesMem-v2/Hades-Memory/Hades-Memory/MemoryMgr.h#86
我目前正在编写一个应用程序,它要求我在任意窗口上调用GetWindowText并将该数据存储到文件中以供以后处理.长话短说,我注意到我的工具在"战地3"中失败了,我将问题缩小到其窗口标题中的以下字符:http: //www.fileformat.info/info/unicode/char/2122/index. HTM
所以我创建了一个小测试应用程序,它只执行以下操作:
std::wcout << L"\u2122";
Run Code Online (Sandbox Code Playgroud)
低并且看到在程序的其余部分中断输出到控制台窗口.
当MessageBoxW等API显示它时,为什么MSVC STL会阻塞这个角色(我假设其他人)?
如何将这些字符打印到我的文件中?
在Windows 7 x64下测试VC10和VC11.
抱歉这个构造不好的帖子,我在这里撕扯我的头发.
谢谢.
编辑:
最小的测试用例
#include <fstream>
#include <iostream>
int main()
{
{
std::wofstream test_file("test.txt");
test_file << L"\u2122";
}
std::wcout << L"\u2122";
}
Run Code Online (Sandbox Code Playgroud)
预期结果:'™'字符打印到控制台和文件.观察结果:文件已创建但为空.没有输出到控制台.
我已经确认我用于我的控制台的字体能够显示有问题的字符,并且该文件肯定是空的(大小为0字节).
编辑:
进一步的调试表明,在流中设置了'failbit'和'badbit'.
编辑:
我也尝试过使用Boost.Locale,即使全新的语言环境充满了所有标准流,我也遇到了同样的问题.
我目前有一个可变参数函数,它接受任意类型的任意数量的参数(duh),但是,我想将类型限制为仅仅是POD的类型,并且也与void*的大小相同或者更小.
void*检查很容易,我刚刚这样做了:
static_assert(sizeof...(Args) <= sizeof(PVOID), "Size of types must be <= memsize.");
Run Code Online (Sandbox Code Playgroud)
但是我无法弄清楚如何为std :: is_pod做同样的事情.
这可能吗?
嘿所有,我目前正在尝试编写一个编译时字符串加密(使用"字符串"和"加密"字样很松散)lib.
我到目前为止的内容如下:
// Cacluate narrow string length at compile-time
template <char... ArgsT>
struct CountArgs
{
template <char... ArgsInnerT> struct Counter;
template <char Cur, char... Tail>
struct Counter<Cur, Tail...>
{
static unsigned long const Value = Counter<Tail...>::Value + 1;
};
template <char Cur>
struct Counter<Cur>
{
static unsigned long const Value = 1;
};
static unsigned long const Value = Counter<ArgsT...>::Value;
};
// 'Encrypt' narrow string at compile-time
template <char... Chars>
struct EncryptCharsA
{
static const char Value[CountArgs<Chars...>::Value + 1];
}; …Run Code Online (Sandbox Code Playgroud) 我目前正在将我的一个项目移植到GCC,我正在使用MinGW-w64项目完成此任务,因为我需要x64和x86支持.
我在设置构建环境时遇到了问题.我的项目目前使用Boost C++库,为了使构建过程更容易,我在项目中也使用了Boost.Build(因为它使集成变得简单).
在MSVC下这很好,因为我可以从命令行执行以下操作:
b2 toolset=msvc address-model=32 # compile as 32-bit
b2 toolset=msvc address-model=64 # compile as 64-bit
Run Code Online (Sandbox Code Playgroud)
由于32位和64位工具链位于不同的目录中,MinGW-w64使这个"有问题".(分别为C:\ MinGW32和C:\ MinGW64).
是否可以设置Boost.Build,它将根据地址模型标志选择正确的工具链?如果没有,我的下一个最佳选择是什么?
编辑:
如果它有帮助,我在MinGW-w64网站的"Personal Builds"文件夹中使用rubenvb 4.6.3-1版本(我特别使用这些版本,因为我希望尝试让我的代码解析 - 但不能编译 - 在Clang下).
编辑:
我刚才想到的一个解决方案是在编译之前"手动"将PATH设置为指向正确的工具链,但是这会给我的构建过程增加一层额外的复杂性,我想避免.理想情况下,我希望它像MSVC一样简单,但我知道这可能是不可能的.在最坏的情况下,我假设我刚刚建议的工作,我只需要在调用Boost.Build之前添加脚本来正确设置PATH.这意味着硬编码路径,我不想做...
在我的应用程序中,我需要在已知且可预测的位置存储"全局"(即非特定于用户)的设置.
我希望应用程序能够从任何地方(作为标准用户,而不是管理员)运行,包括来自不同位置的多个副本,并能够读取和写入保存的配置文件.
数据需要为所有标准用户授予读写访问权限,而不仅仅是一个.
考虑到这一点,这里提到的四个选项是不合适的:http: //msdn.microsoft.com/en-us/library/bb206295(VS.85).aspx#ID0E1BA
那么我有什么选择呢?
我的应用程序是用C++编写的,仅适用于Windows.我需要支持Windows XP及更高版本.
谢谢.
编辑:
为了澄清,忽略由多个实例引起的竞争条件.这个问题仅与存储数据的位置有关.我看不到任何适合的地方:
类似的问题已经被问,所以我不会浪费时间来重新解释它,已有的讨论,可以在这里找到: 在一个键盘钩子toascii将/ ToUnicode破坏死键
我发布一个新问题的原因是我似乎遇到了一个"解决方案",但我不太确定如何实现它.
这篇博文似乎提出了ToUnicode杀死死键支持问题的解决方案:http: //www.siao2.com/2005/01/19/355870.aspx
但是,我不确定如何实施建议的解决方案.推动正确的方向将非常感激.
需要说明的是,我指的是这个:
有两种方法可以解决这个问题:
1)您可以继续使用相同的信息调用ToUnicode,直到它被清除,然后再次调用它以将状态恢复到原来的状态,如果您从未输入任何内容,或者
2)时,键入您可以查找自己的信息缓存什么意思击键信息,而不必在以后调用的API可以提前,然后加载所有的键盘信息的.
我不太确定如何做这些事情(键盘和国际化远非我的强项),所以任何帮助将不胜感激.
谢谢
我有一个仅消息窗口(ATL :: CWindowImpl),它使用RIDEV_INPUTSINK标志为原始输入注册自己,这意味着无论窗口是否是前台窗口,它都会获得所有输入.当只有一个窗口的实例时,这很有效.
但是,当我创建多个窗口实例时,只有一个接收WM_INPUT消息(我当前正在创建两个消息,并且只有第二个要创建消息).
在创建两个窗口期间,RegisterRawInputDevices(使用RIDEV_INPUTSINK | RIDEV_NOLEGACY)正在成功.此外,没有接收原始输入的窗口仍在接收其他消息,因此窗口本身不存在问题......
如果它是相关的,我正在使用VC11测试版,并创建窗口并在不同的线程上调度消息(使用std :: thread).
这是API限制(即每个进程只限一个输入接收器)吗?或者有没有办法让这个工作?
提前致谢.
编辑:
现在我当前的解决方法是只有一个窗口,并将输入消息传递给其他窗口,但这是一个烂摊子,并且在我希望它工作的情况下不能工作(我有我的地方) app加载可能需要原始输入的插件,我不希望他们必须注册我的应用程序,除非我真的必须这样做...).
我遇到的问题类似于这里提出的问题.我有我认为是DER编码的RSA PKCS#1公钥,我想用它来验证我的其他数据/签名,但我甚至无法使解码工作.
我使用的是与该问题的解决方案中提出的相同的代码.
ByteQueue queue;
StringSource ss(key, true, new HexDecoder(new Redirector(queue)));
RSASSA_PKCS1v15_SHA_Verifier verifier;
verifier.AccessKey().BERDecodePublicKey(queue, false, 0);
AutoSeededRandomPool prng;
if (!verifier.AccessKey().Validate(prng, 3))
throw Exception(Exception::OTHER_ERROR, "Failed to validate public key");
Run Code Online (Sandbox Code Playgroud)
当我使用在该问题中发布的密钥时,代码可以正常运行,但是当我尝试使用它时,它会失败.我的格式错了吗?别的什么?我对加密很新,所以它可能是愚蠢/明显的东西......
这是我正在尝试使用的密钥.
30819D300D06092A864886F70D010101050003818B0030818702818100B126088
1BDFE84463D88C6AB8DB914A2E593893C10508B8A5ABDF692E9A5419A3EDBAE86
A052849983B75E3B425C18178B260003D857DF0B6505C6CF9C84F5859FCE3B63F
1FB2D4818501F6C5FA4AD1430EEB081A74ABD74CD1F4AA1FCCA3B88DD0548AED3
4443CEB52444EAE9099AA4FE66B2E6224D02381C248025C7044079020111
Run Code Online (Sandbox Code Playgroud)
编辑:
忘了提,这是我得到的错误:
Error!
Dynamic exception type: class CryptoPP::BERDecodeErr
std::exception::what: BER decode error
Run Code Online (Sandbox Code Playgroud) c++ ×12
windows ×5
c++11 ×3
c ×2
keyboard ×2
stl ×2
templates ×2
unicode ×2
boost ×1
boost-build ×1
crypto++ ×1
cryptography ×1
header-files ×1
mingw ×1
public-key ×1
raw-input ×1
save ×1
tr1 ×1
type-punning ×1
type-traits ×1
winapi ×1
wofstream ×1