【发布时间】:2011-08-04 09:46:06
【问题描述】:
我有一些用 C 风格编写的 C++ 代码。
由于某些原因,我不能使用 C++ 字符串和 IO 库,因此对于字符串处理,我应该只使用 sprintf、itoa 等函数。
我想替换需要临时缓冲区的 C 样式 字符缓冲区[12]; itoa(x, buf, 16); set_some_text(buf);
通过以下代码
class i2a
{
public:
explicit i2a(int value) { ::sprintf(buf, "%d", value); }
operator const char* () const { return buf; }
private:
char buf[12];
};
// usage:
set_some_text(i2a(x));
(这样的类可以写成char<->wchar_t转换等)
我看到某些情况下此类课程会很危险: 例如,可以写
const char* someMeaningfulName = i2a(x);
// the right code should be i2a someMeaningfulName(x); or i2a someMeaningfulName = i2a(x);
set_some_text(someMeaningfulName);
在更复杂的情况下,接受文本的函数不会复制它,而是将指向它的指针保存在某个地方。例如它可能是
class Foo { .... const char* p; };
Foo f(const char* text) { ... foo.p = text; return foo; }
它可能真的不明显,不像const char* 变量。
有没有办法让这些类更安全?
更新:为什么不使用 std::string、boost::lexical_cast、boost::format 等:
该代码在使用 -fno-except 编译时应该可以工作(禁用 C++ 异常 - 没有 throw,没有堆栈展开)。它还应该在内存不足的情况下继续工作。std::string,流使用堆分配的内存,至少会抛出 bad_alloc。
当我们没有可用的堆内存时,通常我们仍然有几千字节的堆栈(例如写给用户我们的内存不足,然后进行适当的清理)。
【问题讨论】:
-
如果您有一个非常奇怪的系统,以至于您甚至无法使用最基本的 C++ 类,请更具体一些。大多数明显的解决方案都会在非 C++ 系统上失效。
-
"i2a someMeaningfulName(x);" i2a 这里是什么?另一个班级?
-
@rageshctech 哦,谢谢,它是同一类。 (修复)
标签: c++