首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

与预定义的宏__FILE__、__LINE__和__FUNCTION__相比,C++20的std::source_location有什么优势?

C++20引入了std::source_location,它是一个用于获取源代码位置信息的类。与预定义的宏FILELINEFUNCTION相比,std::source_location具有以下优势:

  1. 更丰富的信息:std::source_location提供了更详细的源代码位置信息,包括文件名、行号、函数名和编译单元名。相比之下,FILE只提供文件名,LINE只提供行号,FUNCTION只提供函数名。
  2. 静态绑定:std::source_location是一个类,可以在运行时获取源代码位置信息,而不是在编译时。这意味着可以在运行时动态获取调用位置的信息,而不仅仅是编译时的位置。
  3. 可移植性:std::source_location是C++标准库的一部分,因此在符合C++20标准的编译器中都可以使用。相比之下,预定义的宏FILELINEFUNCTION的行为在不同的编译器和平台上可能会有所不同。
  4. 更好的可读性:std::source_location提供了更具可读性的接口,可以直接获取文件名、行号、函数名等信息,而不需要使用字符串操作或其他复杂的处理。
  5. 更灵活的使用:std::source_location可以作为函数参数或返回值,可以方便地在代码中传递和处理源代码位置信息。这使得在调试、日志记录和错误处理等场景中更加灵活和方便。

对于C++20的std::source_location,腾讯云没有直接相关的产品或产品介绍链接地址。然而,腾讯云提供了一系列与云计算相关的产品和服务,如云服务器、云数据库、云存储等,可以帮助开发者构建和部署云原生应用、进行网络通信和安全、音视频处理、人工智能等。您可以访问腾讯云官方网站(https://cloud.tencent.com/)了解更多信息。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【C语言笔记】如何查看数据类型范围?

知识点二:C语言定义 标准C语言预处理要求定义某些对象,每个预定义名称由两个下划线开头两个下划线结尾,这些预定义不能被取消定义(#undef)。...常用几个预处理: __LINE__:表示当前源代码行号; __FILE__:表示当前源文件名称; __DATE__:表示当前编译日期; __TIME__:表示当前编译时间; __FUNCTION...__); printf("当前函数名称:%s\n", __FUNCTION__); return 0; } 程序输出结果为: 预定义常用于程序运行异常跟踪,__FILE__,__LINE__,...__FUNCTION__这是最常用组合,表示文件名、行数函数名。...除了以上提到这五个预定义之外,还有C99标准提出定义如:__STDC_HOSTED__等,兴趣可以查一下。

2.3K20

【嵌入式】C语言程序调试使用技巧

gcc编译过程中,会生成一些,可以使用这些分别打印当前源文件信息,主要内容是当前文件、当前运行函数当前程序行。...具体如下: __FILE__ 当前程序源文件 (char*) __FUNCTION__ 当前运行函数 (char*) __LINE__ 当前函数行 (int) 这些不是程序代码定义,而是编译器产生...具体表达式内容是什么编译器自动写入程序中,这样使用相同打印所有表达式字符串。...) \ printf("file:%s function: %s line: %d "fmt, \ __FILE__, __FUNCTION__, __LINE_...使用do…while定义 使用定义可以将一些较为短小功能封装,方便使用。形式函数类似,但是可以节省函数跳转开销。

64110

为你揭晓RTOS中日志打印组件核心

经过一番查看源码,我终于探索出程序为什么可以知道并且打印出代码所在位置~ 2....C语言编译器中内置了一些定义,这些内置定义可以巧妙地帮我们输出非常有用调试信息,在RTOS日志打印组件中通常用到了这三个内置定义: __FILE__:在源文件中插入当前源文件名; __FUNCTION...__:在源文件中插入当前函数名; __LINE__:在源代码中插入当前源代码行号; 利用这三个定义,使用一行代码即可编写一个最简单日志打印组件: #define DEBUG(format,...)...printf("[%s:%05d][%s]"format"\r\n", __FILE__, __LINE__, __FUNCTION__) 编写一个小程序测试这个仅有一行代码日志打印组件: #include... #define DEBUG(format,...) printf("[%s:%05d][%s]"format"\r\n", __FILE__, __LINE__, __FUNCTION

83040

spdlog 日志库学习,简易封装

(strrchr(__FILE__, '/') + 1):__FILE__) #endif //定义一个在日志后添加 文件名 函数名 行号 定义 #ifndef suffix #define suffix...).c_str() #endif 这种文件行号之类 spdlog 本身也自带,可以参见 SPDLOG_LOGGER_CALL 定义,用这个还得加上: #define SPDLOG_ACTIVE_LEVEL...SPDLOG_LEVEL_TRACE 不过它自带函数用 __FUNCTION__ 在 VS 下会显示类名,我自定义改成了 __func__ 只保留了函数名。...代码如下: #pragma once //定义使输出文件名行号 #define SPDLOG_ACTIVE_LEVEL SPDLOG_LEVEL_TRACE #define SPDLOG_TRACE_ON...(strrchr(__FILE__, '/') + 1):__FILE__) #endif //定义一个在日志后添加 文件名 函数名 行号 定义 #ifndef suffix #define suffix

1K30

C++代码调试方式建议

具体地说,就是在调试程序时候,利用编译器命令行参数定义调试标记(相当于程序中用#define定义),然后再#ifdef#endif之间包含相应调试代码就可以了。...如果手工添加这些信息,无疑会给程序员带来很大负担。因此,C++提供了几个,他们分别是__FILE__、__FUNCTION____LINE__,可以利用它们“自动“获取有关模块、函数信息。...<<__FUNCTION__<<endl; } void func3() { cout<<__LINE__<<endl; } int main(int argc,char* argv[]) {...assert是一个只在调试版本下起作用。另外,用户也可以定义自己辅助来完成调试任务。...(3)对历史数据进行统计跟踪。每个程序员只是背景工作习惯各不相同,通过统计历史上个人最容易出现哪些类型编程错误,以便在将来针对性地排查,是一种有效提高程序质量做法。

1.5K30

【C语言】预编译

日志 条件编译  常见条件编译指令 三大要点 预定义符号 预定义符号一共有⑤种,如下所示↓ __FILE__:表示进行编译文件名。...__STDC__:如果编译器遵循是ANSIC,其中值为1,不然就是未定义。 __FUNCTION__:表示该函数所在函数名。...#ifdef #ifndef 指令 相对于 #if 指令(检测表达式值是否为真),#ifdef #ifndef 指令用于检测指令关键字后面的名称是否已经定义。...其中,#ifdef 指令表示如果已经被定义,那么它检测结果为真,否则返回假;而 #ifndef 指令含义正好 #ifdef 指令相反,它表示如果未被定义,那么它检测结果为真,否则为假。...有的是为了进行一个版本之间维护,例如:商业版免费版等...当然我们还有可能使用条件编译完成其它事情。 ⒉条件编译如何使用? 在上述条件编译讲解当中我们也说过,这里就不在描述了。

83910

CC++代码调试几点建议

具体地说,就是在调试程序时候,利用编译器命令行参数定义调试标记(相当于程序中用#define定义),然后再#ifdef#endif之间包含相应调试代码就可以了。...如果手工添加这些信息,无疑会给程序员带来很大负担。因此,C++提供了几个,他们分别是__FILE__、__FUNCTION____FILE__,可以利用它们“自动“获取有关模块、函数信息。...cout<<__FUNCTION__<<endl; } void func3(){ cout<<__LINE__<<endl; } int main(int argc,char* argv[...assert是一个只在调试版本下起作用。另外,用户也可以定义自己辅助来完成调试任务。...(3)对历史数据进行统计跟踪。每个程序员只是背景工作习惯各不相同,通过统计历史上个人最容易出现哪些类型编程错误,以便在将来针对性地排查,是一种有效提高程序质量做法。

60510

C++20 Coroutine

前言 最近新闻里 C++20 已经确认内容里已经了协程组件,之前都是粗略看过这个协程草案。最近抽时间更加系统性看了下接入实现细节。...%20Installer/7.0/ C++20 协程基本原理 C++20 整个协程体系是 “无栈协程” 思路,整个功能是需要结合编译器功能STL来配合实现。...无栈协程对API设计是要求C++20 Coroutine也不例外, 编译器在检测到内部有使用 这三个关键字时会对函数流程做patch,然后它返回值类型必须符合你所使用关键字规范。...所以,C++20 协程也不能完全说是 “无栈” ,只是在协程函数中需要能够评估出来它需要多少栈空间存数据,不像栈协程那样会浪费比较大地址空间且不利于内存页复用。...to exit" << std::endl; return 0; } 总结 总体感觉上,C++20协程为了兼顾灵活支持非侵入式接入,设计了好几个互相交织大模块,函数级处理协程函数内部

75570

PHP中那些魔术常量

其实PHP还提供了很多常量但都依赖于各类扩展库,而有几个常量是通用并且是跟随它们所在代码位置来提供一些位置有关信息,这些就是魔术常量。...魔术常量是不分大小写,__LINE____line__是一样,但对于工程化开发来说,常量还是尽量以大写为主。 __LINE__ 文件中的当前行号。 echo __LINE__ ....如果用在被包括文件中,则返回被包括文件所在目录。它等价于 dirname(__FILE__)。除非是根目录,否则目录中名不包括末尾斜杠。...自 PHP 5 起本常量返回该函数被定义名字(区分大小写)。在 PHP 4 中该值总是小写字母。 echo __FUNCTION__ ....返回该方法被定义名字(区分大小写)。 echo __METHOD__ .

1.4K10

C++20 Coroutine

前言 最近新闻里 C++20 已经确认内容里已经了协程组件,之前都是粗略看过这个协程草案。最近抽时间更加系统性看了下接入实现细节。...%20Installer/7.0/ C++20 协程基本原理 C++20 整个协程体系是 “无栈协程” 思路,整个功能是需要结合编译器功能STL来配合实现。...无栈协程对API设计是要求C++20 Coroutine也不例外, 编译器在检测到内部有使用 这三个关键字时会对函数流程做patch,然后它返回值类型必须符合你所使用关键字规范。...所以,C++20 协程也不能完全说是 “无栈” ,只是在协程函数中需要能够评估出来它需要多少栈空间存数据,不像栈协程那样会浪费比较大地址空间且不利于内存页复用。...to exit" << std::endl; return 0; } 总结 总体感觉上,C++20协程为了兼顾灵活支持非侵入式接入,设计了好几个互相交织大模块,函数级处理协程函数内部

3K30

高效易用C++单元测试框架:轻松构建高质量代码

实现原理在正式开始介绍实现原理之前,需要特别强调是,在这个单元测试框架中,所有的代码都定义在UnitTest命名空间中。这样做好处是可以避免与其他代码命名冲突,同时也可以更好地组织管理代码。...} private: bool result_{true}; std::string case_name_;};在上面的代码中我们定义了一个C++中测试用例基类TestCase,它定义了一些虚函数成员变量...UnitTestCore类提供了注册测试用例、运行测试用例等基本功能,可以帮助我们更加方便地编写管理单元测试。2.3 单测定义我们单元测试框架预定义了一系列,用于快速构建单元测试。...2.3.2 TEST_CASE这个用于定义测试用例。这个接受一个参数test_case_name,表示测试用例名称。...在定义中,它使用TEST_CASE_CLASS定义测试用例类,并将测试用例类名称作为参数传递给TEST_CASE_CLASS

54030

(五)如何编写高性能日志

= NULL) fclose(m_file); } 这个Log类定义实现代码节选自我一款12306刷票软件,如果需要使用这个类的话包含Log.h头文件,然后使用:LogInfo...LogError("QueryTickets2 failed"); return false; } 这个日志类,每次输出一行,一行中输出时间、日志级别、线程id、文件名、行号、函数签名定义错误信息...cv_; //日志到来标识 bool exit_{false}; std::...使用这两个文件只要包含Logger.h,然后使用如下一行代码启动日志线程就可以了: Logger::GetInstance().Start(); 生成日志,使用头文件里面定义三个LogInfo、LogWarning...日志详细了,请不用担心服务器磁盘空间,因为相比较定位错误,这点磁盘空间还是值得,实在不行可以定期清理日志嘛。

1.4K80
领券