有没有办法乘坐
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
。
致以诚挚的问候
兹拉坦
由于
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;
}