相关疑难解决方法(0)

如何在C++中将数字转换为字符串,反之亦然

由于这个问题每周都会被问到,这个FAQ可能会帮助很多用户.

  • 如何在C++中将整数转换为字符串

  • 如何在C++中将字符串转换为整数

  • 如何在C++中将浮点数转换为字符串

  • 如何在C++中将字符串转换为浮点数

c++ string numeric c++-faq type-conversion

120
推荐指数
2
解决办法
15万
查看次数

什么是scanf格式输入的cin analougus?

通过scanf,通常可以直接获取格式化输入:

1)具有大于0且小于1的实数的行.在'x'上结束,例如:0.32432523x

scanf("0.%[0-9]x", &number);
Run Code Online (Sandbox Code Playgroud)

2)line代表格式的加法:30 + 28 =五十八

scanf(":%d+%d=%99s", &number1, &number2, &total);
Run Code Online (Sandbox Code Playgroud)

什么是cin解决方案,只使用标准库?

c++ input std

15
推荐指数
2
解决办法
7152
查看次数

boost :: lexical_cast <>的Locale不变保证

boost::lexical_cast<std::string>(double)用于将双精度转换为字符串,生成JSON序列化字节流,即(在远程端)由.NET解析.

我能够强制.NET InvariantCulture用于解析,从而在每种可能的语言上返回可预测的结果.

但是,我无法在boost :: lexical_cast文档中找到此保证.我尝试了一下,它对于不同的语言环境设置的工作方式相同.但是,我不能确定只有少数测试,我在文档中遗漏了什么,或者这根本不能保证,我必须使用别的东西?

编辑:我发现了一个问题.

std::locale::global(std::locale("Czech")); 
std::cout << boost::lexical_cast<std::string>(0.15784465) << std::endl;
Run Code Online (Sandbox Code Playgroud)

返回0,15784465,这是不受欢迎的.我可以强迫boost::lexical_cast<>不要知道语言环境吗?

c++ serialization boost invariantculture

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

可以使用thread_local在每个线程的dll中提供静态全局变量吗?

我想在我们的开源库中使用C++ 11关键字thread_local,它可以在静态变量的上下文中在许多平台(Windows,Linux,Mac OS,...)上动态或静态链接.这个变量是一个类类型,它基本上只是封装了一个std :: stringstream变量并初始化它以适应我们的字符串流格式要求.出于性能原因,我们希望将此静态提供(有关更多详细信息,请参阅我之前的问题),如果每个线程完成此操作,则可以.

全局变量应该用在静态模板化类方法中,这些方法必须在头文件中实现.但是,如果我理解正确的话,这意味着库的用户可以在他们的可执行代码中包含这个头,这会将模板化的方法编译成可执行文件.然后,这些方法将从可执行文件的线程中访问提到的全局变量.我如何声明/定义静态变量才能工作,即我需要导出变量或类类型还是足以将其声明为"static thread_local X"?这是我目前的声明:

// SharedStringstream.h
#include <sstream>
// Export stands for _declspec(dllimport) or (dllexport) respectively
class EXPORT SharedStringstream
{
public:
    SharedStringstream();

    static thread_local SharedStringstream s_sharedStreamInstance;

    std::stringstream d_sharedStream;
};
Run Code Online (Sandbox Code Playgroud)

和定义:

// SharedStringstream.cpp
#include "SharedStringStream.h"

SharedStringstream SharedStringstream::s_sharedStreamInstance();

SharedStringstream::SharedStringstream()
{
    d_sharedStream.imbue(std::locale("C"));
    d_sharedStream << std::skipws;
    d_sharedStream >> std::skipws;
}
Run Code Online (Sandbox Code Playgroud)

没有导出我得到链接器错误,我在Visual Studio 2015中收到以下错误:

错误C2492'public:static SharedStringstream SharedStringstream :: s_sharedStreamInstance':具有线程存储持续时间的数据可能没有dll接口

这里给出更多信息,其中基本上表明thread_local可能不会导出变量.为此,我必须将它从类中移出到我的命名空间中,这是唯一的方法吗?

此外:"线程本地存储"上的MSDN页面说明以下关于thread_local和DLL:

thread属性的使用可能会干扰DLL导入的延迟加载.

我们在内部使用DLL的延迟加载来处理我们的库所包含的一些插件,但是不会对该变量进行任何调用.我假设用户可以延迟加载库,尽管我们没有正式支持这个.假设我们不支持延迟加载我们的库并且不在内部调用任何延迟加载的dll中的变量,我们是否能够确定这在任何上下文中都不会成为问题?

我的问题中没有考虑过任何问题吗?

c++ dll c++11

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