【发布时间】:2019-11-06 05:42:52
【问题描述】:
我正在尝试将一些 C++ 代码转换为 C,以便我的编译器无法使用 C++ 代码运行。我想将下面的模板创建为 C。此模板将十进制整数转换为十六进制,如果十六进制字符串的大小小于(sizeof(T)*2),则在 value 前面添加 0。数据类型T可以是unsigned char、char、short、unsigned short、int、unsigned int、long long和unsigned long long。
template< typename T > std::string hexify(T i)
{
std::stringbuf buf;
std::ostream os(&buf);
os << std::setfill('0') << std::setw(sizeof(T) * 2)
<< std::hex << i;
std::cout<<"sizeof(T) * 2 = "<<sizeof(T) * 2<<" buf.str() = "<<buf.str()<<" buf.str.c_str() = "<<buf.str().c_str()<<std::endl;
return buf.str().c_str();
}
感谢您的游览帮助。
编辑1:我尝试使用声明
char * hexify (void data, size_t data_size)
但是当我用 int 值int_value 调用时:
char * result = hexify(int_value, sizeof(int))
它不起作用,因为:
非竞争类型(void 和 int)。
那么在这种情况下,我必须使用宏吗?我没有尝试过使用宏,因为它很复杂。
【问题讨论】:
-
你试过什么?请向我们展示您的 C 代码。在 C 中也没有
template这样的东西。 -
将您的 C 代码转换为 C++ 不是更容易吗?
-
您可以像
printf()这样的标准 C 函数那样做。接受指定类型的格式字符串。否则,有几个函数,每个类型一个。 -
您只需返回
buf.str()- 无需来回转换。另外,std::ostringstream是一个东西,你不需要手动复制它。 -
我会分步进行。首先用你需要的重载替换模板(因为 c 没有模板)。然后以不同的方式命名重载(因为 c 没有重载)。然后将这些函数中的每一个翻译成 C。请注意,在 C 中也有一些事情可以在不诉诸
void*的情况下完成。如果您需要char* foo(int);,那么我总是更喜欢void* foo(void*);
标签: c++ c templates hex decimal