- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在 C++ 中创建一个简单的日志函数,它将代码位置添加到日志消息中。我想避免使用宏以及 __FILE__
和 __LINE__
的使用。
请注意,format
字符串始终是编译时字符串,我希望在编译时进行尽可能多的计算(目标机器是一个小型 MCU)。
我可以通过 source_location
使用 C++20 experimental/source_location
功能。
我也可以使用 {fmt} 。
我从 this 开始。目前,我有以下几点:
#include <fmt/format.h>
#include <experimental/source_location>
using source_location = std::experimental::source_location;
void vlog(fmt::string_view format, fmt::format_args args)
{
fmt::vprint(format, args);
}
template <typename S, typename... Args>
void log(const S& format, const source_location& location, Args&&... args)
{
vlog(format, fmt::make_args_checked<fmt::string_view, uint32_t, Args...>(format, location.file_name(), location.line(), args...));
}
#define MY_LOG(format, ...) log(FMT_STRING("{},{}, " format), source_location::current(), __VA_ARGS__)
int main() {
MY_LOG("invalid squishiness: {}", 42);
}
正确产生
./example.cpp,20, invalid squishiness: 42
。
log
函数采用
source_location
的默认参数(我知道
source_location::current()
作为默认参数是一个很好的做法)。虽然我收到以下错误:
:12:99: error: missing default argument on parameter 'args'
"{},{}, "
部分添加到编译时
format
字符串以产生另一个编译时字符串(用作格式)?
最佳答案
您可以使用表示格式字符串和位置的结构来实现:
#include <fmt/core.h>
#include <source_location>
struct format_string {
fmt::string_view str;
std::source_location loc;
format_string(
const char* str,
const std::source_location& loc =
std::source_location::current()) : str(str), loc(loc) {}
};
void vlog(const format_string& format, fmt::format_args args) {
const auto& loc = format.loc;
fmt::print("{}:{}: ", loc.file_name(), loc.line());
fmt::vprint(format.str, args);
}
template <typename... Args>
void log(const format_string& format, Args&&... args) {
vlog(format, fmt::make_format_args(args...));
}
int main() {
log("invalid squishiness: {}", 42);
}
这打印:
./example.cpp:26: invalid squishiness: 42
神弩:
https://godbolt.org/z/4aMKcW
关于c++ - 使用 {fmt} 和 source_location 创建基于可变参数模板的日志功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66376553/
在我们的项目中,我们决定在我们的项目中使用最新的 fmt 版本 (6.2.0) 并主要使用 printf 功能,因为我们在广泛使用 printf 的地方进行日志记录。 我使用 fmt 包中包含的 CM
JSTL 标签用来绑定数据源(.properties)文件,JSTL 标签用来从指定的资源文件中调用信息。 语法 JSP 标签的语法如下: 代码块 其中: basename:指定要
我有以下 JSTL: enumValue.reputation 给出“非常好”、“完美”等字符串,对于这种情况,我需要将其小写“非常好”、“完美”。怎么把它变成小写?
为什么是这样fmt::format_to(OutputIt, ...)而不是 fmt::print(OutputIt, ...) ?? 我目前正在熟悉 {fmt} , 一个/现代 C++ 格式库。 在
所以我目前正在开始使用 Rust,并且正在阅读我的 Rust By Example。 做练习,边玩边玩代码。 但在 RBE Display函数描述它将 Fmt::Display 描述为比 Fmt::D
我不确定如何命名这个问题,因为我是 Rust 新手,所以请随意提出修改建议。 我有两个结构。一个是 Job 结构,其中包含一些数字,例如作业需要多长时间等。另一个是 JobSequence,其中包含
我不确定如何命名这个问题,因为我是 Rust 新手,所以请随意提出修改建议。 我有两个结构。一个是 Job 结构,其中包含一些数字,例如作业需要多长时间等。另一个是 JobSequence,其中包含
关于Golang中的标准I\O,网上所有的教程,无一异常(exception)地讨论和使用bufio,我测试过,效果很好。 但我的问题是关于使用 fmt 包读取标准输入,这要么给我错误,要么陷入循环。
正如标题,我很难描述这个问题。所以我在下面展示了示例代码、输入和输出。 package main import ( "fmt" ) func main() { for i := 1;
我正在尝试在我的 JSP Web 应用程序上本地化货币,问题是当我要求语言环境时,我只得到语言代码(“en”)而不是完整的语言和国家代码(“en_US”)。问题是,当 setLocale 的值不包含语
我使用的是 MACOS Mojave 版本 10.14.3,需要使用 GNU 编译器而不是 clang。 我使用 brew install gcc 安装了 gcc 编译器.然后我使用 brew ins
我正在尝试编译一些代码,但出现了一个非常奇怪的错误: the trait core::fmt::Show is not implemented for the type core::fmt::Show
我是 Go 语言和编程的新手。 谁能解释错误的含义以及我该如何解决? 最佳答案 使用 fmt.Println 而不是 fmt.PrintLn。将字母 L 小写。 关于go - undefined :
package main import ( "fmt" ) func main() { fmt.Printf("%c, %x, %x", 'ᚵ', 'ᚵ', "ᚵ") } 输出: ᚵ,
每当我在 Windows cmd 上的 Go 中运行 fmt.Print("\033c") 时,它不会清除屏幕,而是在我执行 console 时打印 c。 log("\033c") 在 javascr
我正在使用字典进行一些测试,为此,我以一种格式从数据库中打印出我想要的 Float64 值,以便将它们复制并粘贴到我的测试结构数组中,但是当我的测试失败时,我注意到这些值不同,但仅相差 0.00000
我目前有一个项目是这样组织的: ~/code/go /bin /pkg /src /proj/main.go
我目前正在做一个 spring 项目,我不得不在我的 JSP 中使用 fmt 标签。事实上 fmt 标签对我来说工作正常,它从 messages.properties 读取正确的值文件。 例如: 在
我想知道{fmt}库是否只允许修改包含多个位置参数的字符串中的一个位置参数? 这是我的测试不起作用,{fmt}文档未显示解决方案 std::string text = "{name} is {nb}
Closed. This question is not reproducible or was caused by typos。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-to
我是一名优秀的程序员,十分优秀!