宏定义天坑记录

宏定义天坑记录

事件原委与推理过程

在编译一个使用了Protobuf的项目时出现了如下报错

[yb@VM-8-7-centos boost_searcher]$ make
g++ -o http_server http_server.cc data/raw_html.pb.cc -std=c++11 -lboost_system -lboost_filesystem -lpthread -ljsoncpp -lprotobuf 
In file included from /usr/local/protobuf/include/google/protobuf/io/coded_stream.h:132,from data/raw_html.pb.h:23,from index.hpp:11,from searcher.hpp:10,from http_server.cc:43:
/usr/local/protobuf/include/google/protobuf/io/coded_stream.h: In member function 'std::ptrdiff_t google::protobuf::io::EpsCopyOutputStream::GetSize(uint8_t*) const':
/usr/local/protobuf/include/google/protobuf/io/coded_stream.h:835:5: error: 'LOGLEVEL_4' is not a member of 'google::protobuf'; did you mean 'LOGLEVEL_INFO'?835 |     GOOGLE_DCHECK(ptr <= end_ + kSlopBytes);  // NOLINT|     ^~~~~~~~~~~~~

大致意思就是LOGLEVEL_3这玩意没被定义过,非常莫名奇妙的错误

当发现是google/protobuf下的头文件的问题,直接就头大了

编译过程中的语法错误就是两个极端,

  • 要么是自己的代码有语法错误,改一下就行
  • 但这是官方头文件文件报的语法错误啊,错误肯定不可能出现在人家,又不能调试,那没点时间和运气,这问题怕是搞不定

但我多少是有点运气在的,无意间交换了源代码中的两个头文件,居然编译过了!!!!

发现只要"searcher.hpp"定义在"HttpServer.hpp"前面,就能编过

啊,这就有点玄幻了啊

思考一下,这两个头文件内,应该是有某些依赖关系,或者跟编译的顺序有关

试了一下

这样也能过

也就是说,searcher.hpp中一定有某些东西要出现在HttpServer.hpp前面

又瞅了一眼报错

既然报错从你来,就拎着你测吧(整个头文件包含树中,这个文件处于末梢,再向末梢就是官方文件了)

放这里,诶果然又能编过了

接下来,就拿它沿着整条头文件包含树,一直向下试,看哪里出现了问题

直到到达一个log.hpp的头文件,不能再向下时

发现,当raw_html.pb.hFATAL上时能编译过,在其下面则无法编过

啊,小东西,终于找到你了啊

如果你观察仔细,发现这个3,在前面的报错里也有点端倪

当把这个宏定义为4时,果然变成了LOGLEVEL_4

原因分析

从上面推理中可以看出,显然是这个宏定义的问题

google/protobuf的头文件中一定也有一个FATAL宏的定义,或者出现了FATAL关键词

由于C语言对宏的处理发生在预处理阶段,只进行简单无脑的文本替换

在所有的头文件中,我们都写了#pragma once,也就意味着在整个头文件包含体系中,只要出现第一次FATAL的宏定义,那以后的所有FATAL宏定义都将被忽视,一些不该被进行宏替换的地方也会被替换

自然,当我们把google/protobuf的头文件放在我们的FATAL之前,也就不会受我们的宏定义影响

总结

虽然某些时候,对宏的使用能让我们的代码简单玄妙不少,但坑也是真的坑啊

有了上面的经验教训,宏这种东西以后还是尽量少用了,毕竟不是每次都这么好运气

如果替换宏的话,大家可以尝试使用conststatic const或者枚举的语法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/103074.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库分析工具explain

1.id:查询语句的编号 2.select_type:查询类型&#xff0c;有三种&#xff0c;simple简单查询&#xff0c;primary&#xff0c;subquery等 3.table:查询的表 4.type:查询性能&#xff0c;system > const > eq_ref > ref > range > index > ALL system&…

软件设计模式系列之一——设计模式概述

1 设计模式的由来和概念 设计模式最早出现在建筑行业&#xff0c;是一位建筑领域的大牛&#xff0c;针对不同建筑物的建造方法进行了总结&#xff0c;针对类型相似的建筑场景&#xff0c;将较好的解决方案进行比较&#xff0c;提取了其中共性的套路规范&#xff0c;形成一定的设…

JAR will be empty - no content was marked for inclusion!

现象 在对自建pom依赖组件打包时&#xff0c;出现JAR will be empty - no content was marked for inclusion!错误。 方案 在pom中怎么加packaging标签内容为pom&#xff0c;标识只打包pom文件 <?xml version"1.0" encoding"UTF-8"?> ...<grou…

【网络】路由配置实践1

网络实践-路由篇 本文使用vmware虚拟机进行路由表配置实践&#xff0c;通过配置路由表连接两个不同的网络&#xff0c;不涉及路由协议&#xff0c;全手动配置&#xff0c;旨在理解路由表的概念 网络规划&#xff1a; 准备三台centos7虚拟机&#xff0c;其中一台作为路由设备ro…

一辆新能源汽车的诞生之旅:比亚迪常州工厂探营

作为在新能源汽车领域首屈一指的国产品牌&#xff0c;比亚迪近年来可以说是捷报频传&#xff0c;高奏凯歌。 以比亚迪常州工厂为例&#xff0c;据介绍该工厂当初规划设计时定下的生产目标&#xff0c;是年产量能够达到20万辆。然而在2023年上半年&#xff0c;该工厂光是主要销往…

优先发展非化石能源

生态兴则文明兴。面对气候变化、环境风险挑战、能源资源约束等日益严峻的全球问题&#xff0c;中国树立人类命运共同体理念&#xff0c;促进经济社会发展全面绿色转型&#xff0c;努力推动本国能源清洁低碳发展。 智慧光伏遮阳伞&#xff0c;搭配座椅设置智能补给休息区&#x…

如何解决国标GB28181视频平台EasyGBS国标云服务平台设备在线,通道却显示离线的情况

EasyGBS是基于国标GB28181协议的视频平台&#xff0c;可支持视频直播、录像、云存储、检索与回放、云台控制、告警上报、语音对讲等功能。EasyGBS平台功能全面、综合性强、视频能力灵活&#xff0c;能够涵盖所有视频监控领域的需求&#xff0c;已经在大量的项目中落地应用&…

重磅功能 一键助你打造TikTok爆款视频

内容为王的时代&#xff0c;内容需求大爆炸。短视频电商即是当下的时代红利&#xff0c;也是营销领域最前沿的谜题。 TikTok短视频日新月异&#xff0c;但是内容选题、标签、热度视频该如何找&#xff1f;这些问题至关重要... 为了解决上述这些电商客户的痛点&#xff0c;超店…

酷开系统游戏空间,开启大屏娱乐新玩法

在这个充满科技感和无限创意的时代&#xff0c;游戏已经成为我们生活的一部分。而随时着科技的不断发展&#xff0c;以及游戏爱好者的游戏需求在不断提高&#xff0c;促使游戏体验也向更加丰富多彩的方向发展。显然&#xff0c;酷开科技早已经认识到游戏发展的新蓝图&#xff0…

一个帮各位填秋招表格省一点事的浏览器插件

最近应该很多和我一样的双非鼠鼠在秋招等面试&#xff0c;而且处于海投阶段&#xff0c;为了不忘记投了哪些公司&#xff0c;可以用这样一个表格来记录&#xff1a; 其中有些字段&#xff0c;比如状态、投递时间、查看进度的网址其实可以不手动输入&#xff0c;所以搞个插件来…

2023 AZ900备考

文章目录 如何学习最近准备考AZ900考试&#xff0c;找了一圈文档&#xff0c;结果发现看那么多文档&#xff0c;不如直接看官方的教程https://learn.microsoft.com/zh-cn/certifications/exams/az-900/ &#xff0c;简单直接&#xff0c;突然想到纳瓦尔宝典中提到多花时间进行思…

2023年证券投资咨询行业研究报告

第一章 概况 1.1 定义 证券投资咨询业务是指取得监管部门颁发的相关资格的机构及其咨询人员为证券投资者或客户提供证券投资的相关信息、分析、预测或建议&#xff0c;并直接或间接收取服务费用的活动。 根据服务对象的不同&#xff0c;证券投资咨询业务可以分为&#xff1a…