当前位置: 首页 > news >正文

在C++中参考源码的实现

参考源码的实现参考 gcc 和 mscv 的实现会发现内部依靠的是一些与 builtin 相关的内建函数。注意所有内建函数均已具体编译器和平台而不同。下方代码在笔者的 x86windows 平台的 mscv 和 gcc 中可以通过namespace my { class source_location { public: using sequence_type int; private: const char* m_file ; const char* m_func ; sequence_type m_line{}; sequence_type m_column{}; public: static source_location current( const char* const file __builtin_FILE(), const char* const func __builtin_FUNCTION(), const sequence_type line __builtin_LINE(), #ifdef _MSC_VER const sequence_type column __builtin_COLUMN() #else const sequence_type column 0 #endif ) noexcept { source_location ret; ret.m_line line; ret.m_column column; ret.m_file file; ret.m_func func; return ret; } public: constexpr source_location() noexcept default; constexpr sequence_type line() const noexcept { return m_line; } constexpr sequence_type column() const noexcept { return m_column; } constexpr const char* file_name() const noexcept { return m_file; } constexpr const char* function_name() const noexcept { return m_func; } }; } // namespace my #include iostream #include string bool log(const std::string msg , const my::source_location location my::source_location::current() ) { std::cout File: location.file_name() std::endl; std::cout Fun: location.function_name() std::endl; std::cout Line: location.line() std::endl; std::cout Column: location.column() std::endl; std::cout Msg: msg std::endl; return true; } const bool flag log(); int main() { log(Hello world!); }其实多数编译器在 C20 标准发布前就已经存在了这些内置指令所以即使你的编译器不支持 C20也可以自行查看是否存在这些内置的指令函数并使用它。GCC 11.2.0 MinGW-W64File: main.cpp Fun: Line: 17 Column: 22 Msg: File: main.cpp Fun: int main() Line: 20 Column: 8 Msg: Hello world!MSVC V19.29File: E:\vs-2019\SolutionName\Latest\main.cpp Fun: Line: 17 Column: 19 Msg: File: E:\vs-2019\SolutionName\Latest\main.cpp Fun: main Line: 20 Column: 5 Msg: Hello world!关于文件名是否包含路径问题可能受到编译时的执行路径问题我们暂不关心差别。而这里的函数名和列号两者均不相同可见这部分的内容虽然标准给出了行为规定但是具体实现还是有差别的。
http://www.rkmt.cn/news/1300210.html

相关文章:

  • 告别“加载慢”:在 Node.js 中实现 GeoJSON 到 MVT 的毫秒级动态发布
  • 我终于把windows电脑中的这三个软件卸载了:PuTTY、Notepad++ 和 WinSCP
  • shotdiff:轻量级像素级图片差异检测工具在UI自动化测试中的应用
  • 基于Node.js的Markdown文档自动化转换工具:从原理到CI/CD集成实战
  • 开源机械臂技能化控制:从硬件驱动到应用集成的实践指南
  • 开源UI组件库深度解析:从设计系统到工程实践
  • 基于Sho框架的AI应用开发:从流式响应到生产部署
  • Markdown文档本地打包转换利器:一键生成可移植HTML文件
  • LabVIEW循环定时核心原理与工程实践:从等待函数到定时循环的深度解析
  • ElevenLabs乌尔都语语音合成精度实测报告(WER 8.2% vs 行业均值19.6%):为什么它突然支持Nastaliq音素映射?
  • 【仅开放72小时】ElevenLabs德文语音生成高级提示词库(含137个Schwäbisch/Bavarian方言指令模板)
  • Agent的安全边界:如何防止AI失控(对齐问题)
  • 大语言模型+agent 赋能AI 科研助手再次进化:从“会聊天”到“会做生物医学分析”
  • 量子奇异值变换(QSVT)无块编码方案的技术突破
  • 为什么你的波普图总显“廉价”?——深度解析CMYK通道模拟偏差、网点密度阈值与--v 6.2渲染引擎的底层冲突
  • ColabFold完整指南:15分钟免费预测蛋白质三维结构的终极解决方案
  • Linux系统版本信息与内核定位技巧
  • OBS多平台直播同步推流:obs-multi-rtmp插件架构设计与实战指南
  • 双目视觉自动化药房智能上药系统【附程序】
  • ARM Cortex-A720AE/A725集群架构与缓存优化指南
  • 如何用Kafka-King轻松管理Kafka集群:5分钟上手完整指南
  • 解密ComfyUI-WanVideoWrapper:在ComfyUI中突破AI视频生成的技术壁垒
  • 3D打印印章模具全攻略:从数字设计到硅胶翻模的实践指南
  • 从API密钥管理视角看Taotoken如何提升团队安全与审计效率
  • AI代码管理器:统一多模型编程助手,提升开发效率与代码质量
  • Arm Cortex-A78C低功耗架构解析与优化实践
  • ElevenLabs葡语语音突然失真?3分钟定位根源:是重音规则冲突、还是LLM前端文本归一化失效?
  • EB Garamond 12:古典字体与现代设计的完美邂逅
  • 【目标检测系统网页版】基于YOLOv8的淡水鱼检测系统
  • 部署黑科技:懒人专属Docker-Compose一键拉起OpenClow容器化全生态