`std::sprintf` 或 `std::snprintf` 带有参数包,无需额外调用和 tmp 缓冲区

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

有没有办法乘坐

tmp
并在
std::snprintf
中第二次拨打
Print
?我可以通过一个
std::snprintf
电话来完成同样的操作吗?

// arm-none-eabi-g++ -std=c++14 -O3 -Wall -fno-rtti -fno-exceptions

#include <array>
#include <cstdint>
#include <cstdio>
#include <utility>

void TransmitViaUartAndDma(const char * buffer, int len) {
  // "Embedded World"
  (void)buffer;
  (void)len;
}

constexpr std::size_t buf_size = 64; // = sizeof(buffer)/sizeof(buffer[0])
std::array<char, buf_size> buffer{};

template<typename Arg, typename ...Args>
void Print(Arg&& arg, Args&&... args) {
  std::array<char, buf_size> tmp{};
  int len = std::snprintf(tmp.begin(), buffer.size(),
                                       "%s"
                                       "\n",
                                       std::forward<Arg>(arg));
  // std::printf("len = %d\n", len);
  len = std::snprintf(buffer.begin(), buffer.size(),
                                      tmp.cbegin(),
                                      std::forward<Args>(args)...);
  // std::printf("len = %d\n", len);
  TransmitViaUartAndDma(buffer.cbegin(), len);
}

int main() {
  std::uint32_t val1{222};
  std::uint32_t val2{111};
  Print("%u. %u. Hello, ", val1, val2);
  // std::printf(buffer.cbegin());
  Print("%u. %u. World!", val2, val1);
  // std::printf(buffer.cbegin());
  return 0;
}

// 222. 111. Hello, 
// 111. 222. World!

演示 嵌入式

注意:我无法使用

std::cout

致以诚挚的问候

兹拉坦

c++11 embedded printf c++14 std
1个回答
0
投票

由于

tmp
充当第二个
snprintf
的格式字符串,我认为摆脱
tmp
(无需重新编写代码以不使用
snprintf
)的唯一方法就是移动
 \n
字符从
Print()
传出并进入呼叫者,例如:

template<typename ...Args>
void Print(const char *format, Args&&... args) {
  int len = std::snprintf(buffer.begin(), buffer.size(),
                                       format,
                                       std::forward<Args>(args)...);
  // std::printf("len = %d\n", len);
  TransmitViaUartAndDma(buffer.cbegin(), len);
}

int main() {
  std::uint32_t val1{222};
  std::uint32_t val2{111};
  Print("%u. %u. Hello, \n", val1, val2);
  // std::printf(buffer.cbegin());
  Print("%u. %u. World!\n", val2, val1);
  // std::printf(buffer.cbegin());
  return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.