如何安全地使用 C 格式化函数?

问题描述 投票:0回答:1

在 Linux 64 位和 Windows MinGW 上,长很可能是 64 位宽。在 Visual Studio 64 位上,长为 32 位宽。假设我有一个固定的 32 位或 64 位整数类型,当我调用 printf() 之类的东西时,我必须指定正在读取的类型。如果我记错了,那就是UB。所以我的 32 位或 64 位类型并不是专门的 int、long 或 long long,而是上帝知道的类型。

int32_t my_number;

fprintf("%l", my_number); // LONG IS STIPULATED TO BE "AT LEAST" 32-BITS BUT NOT GUARANTEED

int64_t my_number;

fprintf("%ll", my_number); // LONG LONG IS STIPULATED TO BE "AT LEAST" 64-BITS BUT NOT GUARANTEED

同样的情况也适用于 ltoa() 等其他函数。我想问题在于这样一个事实:从函数的角度来看,它只知道一个“指针”,并且只是根据程序员调用的函数全力运行,这看起来真的很疯狂,容易出错且危险,更不用说事实上,如果您在代码中的任何地方更改调用这些函数的其中一种类型,那么您的计算机就会繁荣起来。

  1. 考虑到类型及其原始大小的差异,您应该如何使用这些函数?

  2. 你应该如何应对你可能会在某个地方改变你的类型的现实?

我应该使用这些功能吗? Rust 的人们一直在谈论 C++ 是多么不安全,但与此相比,它是一个充满泡沫的乌托邦天堂。我通常对 C++ 进行编程,是否最好遍历所有类型并模板化所有内容,以便每种类型都调用 write 函数?这是否需要检查类似的内容:

像这样:

template <typename T>
void value_to_ascii(const char* buffer, int max_size, const T& val)
{
     if constexpr(std::is_same_v<T, long>)
           ltoa();
     else if constexpr(std::is_same_v<T, int>)
           itoa();     


} 
c++ c
1个回答
0
投票

考虑到类型及其原始大小的差异,您应该如何使用这些函数?

使用适当的格式。

类型 格式 注释
long signed int
"%ld"
long long signed int
"%lld"
int32_t
"%" PRId32
#include <inttypes.h>
int64_t
"%" PRId64
#include <inttypes.h>

你应该如何应对你可能会在某个地方改变你的类型的现实?

您可以创建与

int32_t
相同的方法:typedef,加上格式宏。

© www.soinside.com 2019 - 2024. All rights reserved.