小编Rap*_*tor的帖子

C++中编译器和评估的参数顺序

好吧,我知道标准规定C++实现可以选择评估函数的哪个顺序参数,但是在实际影响程序的情况下是否有任何实现"利用"它的实现?

经典示例:

int i = 0;
foo(i++, i++);
Run Code Online (Sandbox Code Playgroud)

注意:我不是在找人告诉我评估的顺序不能依赖,我很清楚这一点.我只对任何编译器是否真的按照从左到右的顺序进行评估感兴趣,因为我的猜测是,如果他们做了很多写得不好的代码就会破坏(这是正确的,但他们仍然可能会抱怨).

c++ operator-precedence

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

aligned_storage和严格别名

我目前正在使用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

28
推荐指数
1
解决办法
1493
查看次数

什么时候只有标题库可以接受?

就个人而言,我非常喜欢仅限标题的库,但有人声称它们会因为过度内联而导致代码膨胀(以及编译时间较长的另一个明显问题).

我在想,这些说法有多少真相(关于臃肿的说法)?

此外,成本是否合理?(显然有一些不可避免的情况,例如它是纯粹或大部分使用模板实现的库,但是我对实际可用的选项更感兴趣.)

我知道就这样的事情而言,没有严格的规则,准则等,但我只是想了解别人对这个问题的看法.

PS是的,这是一个非常模糊和主观的问题,我知道,因此我已将其标记为此类.

c++ header-files

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

如果T是POD,std :: array <T,S>是否保证为POD?

我正在编写一个C++内存编辑库,对于读/写API,我使用类型特征(std :: is_pod,std :: is_same)和boost :: enable_if来提供3个重载:

  1. POD类型.例如MyMem.Read(SomeAddress);
  2. 字符串类型.例如MyMem.Read>(SomeAddress); (这实际上并没有读出C++字符串,它会读出一个C风格的字符串并将其转换为C++字符串.)
  3. 矢量类型.例如MyMem.Read>(SomeAddress,NumElem); (这实际上并没有读出一个向量,而是读出一个C风格的数组并将其转换为向量.)

重载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

c++ templates stl tr1 c++11

17
推荐指数
2
解决办法
4149
查看次数

Windows Unicode C++流输出失败

我目前正在编写一个应用程序,它要求我在任意窗口上调用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,即使全新的语言环境充满了所有标准流,我也遇到了同样的问题.

c++ windows unicode stl wofstream

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

变异模板和类型特征

我目前有一个可变参数函数,它接受任意类型的任意数量的参数(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做同样的事情.

这可能吗?

c++ type-traits variadic-templates c++11

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

使用Variadic模板编译时"字符串"操作

嘿所有,我目前正在尝试编写一个编译时字符串加密(使用"字符串"和"加密"字样很松散)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)

c++ templates metaprogramming c++11

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

使用MinGW-w64和Boost.Build构建C++

我目前正在将我的一个项目移植到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.这意味着硬编码路径,我不想做...

c++ windows boost mingw boost-build

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

将"全球"数据保存为标准用户?

在我的应用程序中,我需要在已知且可预测的位置存储"全局"(即非特定于用户)的设置.

我希望应用程序能够从任何地方(作为标准用户,而不是管理员)运行,包括来自不同位置的多个副本,并能够读取和写入保存的配置文件.

数据需要为所有标准用户授予读写访问权限,而不仅仅是一个.

考虑到这一点,这里提到的四个选项是不合适的:http: //msdn.microsoft.com/en-us/library/bb206295(VS.85).aspx#ID0E1BA

那么我有什么选择呢?

我的应用程序是用C++编写的,仅适用于Windows.我需要支持Windows XP及更高版本.

谢谢.

编辑:

为了澄清,忽略由多个实例引起的竞争条件.这个问题仅与存储数据的位置有关.我看不到任何适合的地方:

  1. 可预测的(例如,%APPDATA%\ Foo是'可预测的'路径,但遗憾的是用户特定的)
  2. 全局(例如%PROGRAMDATA%\ Foo是一个全局路径,但不幸的是只有创建用户具有写访问权限)
  3. 可访问(标准用户需要能够在给定目录中创建新文件,这适用于系统上的所有用户)

c c++ windows configuration save

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

如何在不破坏死键支持的情况下使用ToUnicode?

类似的问题已经被问,所以我不会浪费时间来重新解释它,已有的讨论,可以在这里找到: 在一个键盘钩子toascii将/ ToUnicode破坏死键

我发布一个新问题的原因是我似乎遇到了一个"解决方案",但我不太确定如何实现它.

这篇博文似乎提出了ToUnicode杀死死键支持问题的解决方案:http: //www.siao2.com/2005/01/19/355870.aspx

但是,我不确定如何实施建议的解决方案.推动正确的方向将非常感激.

需要说明的是,我指的是这个:

有两种方法可以解决这个问题:

1)您可以继续使用相同的信息调用ToUnicode,直到它被清除,然后再次调用它以将状态恢复到原来的状态,如果您从未输入任何内容,或者

2)时,键入您可以查找自己的信息缓存什么意思击键信息,而不必在以后调用的API可以提前,然后加载所有的键盘信息的.

我不太确定如何做这些事情(键盘和国际化远非我的强项),所以任何帮助将不胜感激.

谢谢

c c++ windows keyboard unicode

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

多个原始输入窗口接收器

我有一个仅消息窗口(ATL :: CWindowImpl),它使用RIDEV_INPUTSINK标志为原始输入注册自己,这意味着无论窗口是否是前台窗口,它都会获得所有输入.当只有一个窗口的实例时,这很有效.

但是,当我创建多个窗口实例时,只有一个接收WM_INPUT消息(我当前正在创建两个消息,并且只有第二个要创建消息).

在创建两个窗口期间,RegisterRawInputDevices(使用RIDEV_INPUTSINK | RIDEV_NOLEGACY)正在成功.此外,没有接收原始输入的窗口仍在接收其他消息,因此窗口本身不存在问题......

如果它是相关的,我正在使用VC11测试版,并创建窗口并在不同的线程上调度消息(使用std :: thread).

这是API限制(即每个进程只限一个输入接收器)吗?或者有没有办法让这个工作?

提前致谢.

编辑:

现在我当前的解决方法是只有一个窗口,并将输入消息传递给其他窗口,但这是一个烂摊子,并且在我希望它工作的情况下不能工作(我有我的地方) app加载可能需要原始输入的插件,我不希望他们必须注册我的应用程序,除非我真的必须这样做...).

c++ windows keyboard winapi raw-input

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

无法对RSA公钥进行BER解码

我遇到的问题类似于这里提出的问题.我有我认为是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++ cryptography public-key-encryption crypto++ public-key

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