标签: visual-c++-2015

C++ 11 std :: cout <<"UTF-8中的字符串文字"到Windows cmd控制台?(Visual Studio 2015)

简介:如何cmd使用std::cout流将使用UTF-8编码(Windows CP 65001)存储的源代码中定义的字符串文字正确打印到控制台?

动机:我想修改优秀的Catch单元测试框架(作为实验),以便它显示带有重音字符的文本.修改应该简单,可靠,并且对其他语言和工作环境也应该有用,以便作者可以接受它作为增强.或者,如果你知道Catch,如果有其他替代解决方案,你可以发布吗?

细节:让我们从捷克版的"快速棕色狐狸......"开始吧

#include <iostream>
#include "windows.h"

using namespace std;

int main()
{
    cout << "\n-------------------------- default cmd encoding = 852 -------------------\n";
    cout << "P?íšern? žlu?ou?ký k?? úp?l ?ábelské ódy!" << endl;

    cout << "\n-------- Windows Central European (1250) set for the cmd console --------\n";
    SetConsoleOutputCP(1250);
    std::cout << "P?íšern? žlu?ou?ký k?? úp?l ?ábelské ódy!" << std::endl;

    cout << "\n------------- Windows UTF-8 (65001) set for the cmd console …
Run Code Online (Sandbox Code Playgroud)

windows cmd utf-8 c++11 visual-c++-2015

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

使用安全_vsnprintf_s获取所需的缓冲区长度

我正在尝试更新一些"遗留"代码,以符合MSVC的最新安全更新,并且我正面临着迁移_vsnprintf到的一些问题_vsnprintf_s.

特别是,我_vsnprintf使用空缓冲区调用,为计数/长度调用零,获取结果,分配所需大小的缓冲区(return value + 1),然后_vsnprintf使用新分配的缓冲区和已知正确的大小再次调用:

size_t length = _vsntprintf(nullptr, 0, mask, params);
TCHAR *final = new TCHAR [length + 1];
_vsntprintf(final, length + 1, mask, params);
Run Code Online (Sandbox Code Playgroud)

MSDN记录了此行为:

如果count指定的缓冲区大小不足以包含format和argptr指定的输出,则vsnprintf的返回值是count(如果count足够大)将写入的字符数.如果返回值大于count-1,则输出已被截断.

我正在尝试做同样的事情_vsnprintf_s,但它的文档不包含相同的内容.相反,它说

如果存储数据和终止空值所需的存储超过sizeOfBuffer,则调用无效参数处理程序,如参数验证中所述,除非count为_TRUNCATE,在这种情况下,将写入适合缓冲区的字符串,并且 - 1回来了.

无论如何都要尝试以下内容:

size_t length = _vsntprintf_s(nullptr, 0, 0, mask, params);
Run Code Online (Sandbox Code Playgroud)

这导致"长度"为零.如果您传入_TRUNCATE(-1)作为计数,则以下断言失败:

表达式:buffer!= nullptr && buffer_count> 0

我认为可以覆盖_set_invalid_parameter_handler并以某种方式找出长度应该是多少,但是必须有一种更简单的方法吗?

c++ printf visual-c++-2015

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

Visual C++ 2017 Redistributable包可以支持使用VC2015的应用程序吗?

如果我在我的机器上只安装Visual C++ 2017 Redistributable,它是否可以支持为2015年编写的应用程序

换句话说,如果我卸载Visual C++ 2015 Redistributable并安装Visual C++ 2017 Redistributable,那么所有应用程序都可以正常运行吗?

c++ redistributable vcredist visual-c++-2015 visual-c++-2017

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

VS2017和VS2015之间的二进制兼容性

这个帖子: Visual-C++ - 2017二进制兼容VC++ - 2015?清楚地说,VS 2017与VS 2015是二进制兼容的.它甚至看起来像官方立场.

我的问题是,在过去,我清楚地记得每当我尝试将使用不同版本的MSVC编译的静态库链接到EXE中时,遇到链接器错误(我不记得具体的错误集)使用较新版本的MSVC构建.

然而,二进制(in)兼容性听起来像是在运行时会在你脸上爆炸的东西,而不是链接时间.

有人能告诉我,以前版本的MSVC是否确实生成了版本不匹配的链接器错误?这是如何完成的?

编辑

这如何影响打开WPO/LTCG时构建的静态库?我相信这些产生了中间目标文件(而不是COFF),并且Microsoft不保证这些中间文件的格式在不同版本的编译器中保持停滞.

abi binary-compatibility visual-c++-2015 visual-c++-2017

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

如何在 Visual C++ 2015 中的 C++ 转换运算符的尖括号内保留空格?

我想以这种方式格式化我的 C++ 转换运算符:

Class * foo = static_cast< Class * >( bar );
Run Code Online (Sandbox Code Playgroud)

Visual Studio 坚持删除尖括号内的空格:

Class * foo = static_cast<Class*>( bar );
Run Code Online (Sandbox Code Playgroud)

我如何防止它这样做?

casting code-formatting visual-c++-2015

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

在 Windows 上使用 libssh2 和 libopenssl 的 libgit2

我以前尝试过,但在完整版本中几乎没有成功,但即使现在失败了,而且我显然在 Windows 上遗漏了一些东西(是的,它可能是 Windows :P)

有人可以带我过去吗

  1. 找到正确的 OpenSSL 以使用 libssh2 进行编译
  2. 实际上cmake/将libssh2编译成libgit2,因为它一直说找不到libssh2,我正在努力再次构建它。

我正在使用 CMake gui For windows,尝试构建一个 VC2015 项目

我在构建 libgit2 时遇到的错误是

checking for module 'libssh2'
  package 'libssh2' not found

LIBSSH2 not found. Set CMAKE_PREFIX_PATH if it is installed outside of the default search path.
Run Code Online (Sandbox Code Playgroud)

即使我已经把它放在每一个可能的地方,我认为它会看起来,我试过设置CMAKE_PREFIX_PATH

如果有人在 Windows 上成功完成了它,我将不胜感激一两个关于我做错了什么或应该做什么的指针

谢谢罗伯特

c++ openssl libgit2 libssh2 visual-c++-2015

0
推荐指数
1
解决办法
2265
查看次数

在C++ Visual Studio中直接从float复制字节到unsigned int?

我试图直接将浮点数转换为无符号整数,没有任何隐式转换数,(所以不是C风格或静态转换)只是将字节直接复制到另一个.在Windows Visual Studio 2015中,float和无符号整数的大小是相同的(4字节),所以我认为在这方面没有任何问题...我提出了一个解决方案,但必须有一个更好的方法来做我想要的.

unsigned int x = 3;
float y = 2.4565;
*reinterpret_cast<float*>(&x) = y;
Run Code Online (Sandbox Code Playgroud)

这就是我想要的,并将X设置为1075656524.

如果有的话,我更喜欢跨平台的解决方案.我知道类型的大小可能因平台而异,所以这可能是不可能的.

编辑:为了澄清,我希望浮动的所有字节都复制到unsigned int不变.存储在float中的每个位都应存储在无符号整数中.还有一个不使用memcpy的解决方案吗?我想避免使用已弃用的函数.

c++ floating-point casting visual-c++-2015

0
推荐指数
1
解决办法
742
查看次数

std :: array作为另一个标准容器的元素类型?

似乎没有任何反对它的规则,以及我得到的错误

std::vector< std::array<int,8> > output;
output.resize (8);
Run Code Online (Sandbox Code Playgroud)

C2036 'std::array<int,0x08> *': unknown size

这没有意义.内部的代码<vector>是推进内部end指针,也在其他地方使用(也就是扩展的计算大小).a的大小struct{int x[8];}肯定是"已知的".

这里发生了什么?


嗯,因为它不仅仅是一个简单的拼写错误或者某些东西,并且在其他人尝试它时似乎工作正常(并且其他人写的样本为我工作!)我减少了源文件,直到没有剩下任何东西,但是令人讨厌的陈述,它仍然失败.这是整个文件.预编译的标头已关闭.

//#include <SDKDDKVer.h>

#include <vector>

int main()
{

    std::vector< std::array<int,8> > output;
    output.resize (16);

}
Run Code Online (Sandbox Code Playgroud)

我正在使用x64构建,发布版本.


弄清楚了:

这不是一个缺少的#include vector,但是对于array!它显然是在其他标题中向前声明但是不完整.

c++ stl visual-c++-2015

-6
推荐指数
1
解决办法
147
查看次数