宏定义天坑记录

news2025/7/20 7:23:04

宏定义天坑记录

事件原委与推理过程

在编译一个使用了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.coloradmin.cn/o/990044.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JAVA学习-IDEA创建父子项目

JAVA培训-创建父子项目 一、创建父模块 1、new一个新项目&#xff0c;如下图所示&#xff1a; 2、由于这里是父级Maven项目&#xff0c;所以什么都不用选&#xff0c;只需要将SpringBoot版本选成稳定的版本即可。后面带&#xff08;SNAPSHOT&#xff09;&#xff0c;代表版本…

如何理解focal loss/GIOU(yolo改进损失函数)

Focal Loss的公式如下&#xff1a; Focal Loss -α(1 - p)^γ * log 其中&#xff0c;α是正样本的调节因子&#xff0c;γ是控制难易样本权重分配的参数&#xff0c;p是模型预测的概率值。 根据公式&#xff0c;可以看出当样本属于困难样本时&#xff0c;(1 - p) 的值较大…

如何全方位了解购房信息?VR全景技术为您解答

在存量房贷利率下调政策下&#xff0c;房子逐渐回归到居住属性&#xff0c;在对于有购房刚需的客户来说&#xff0c;无疑是一大利好政策&#xff0c;此类客户有着强烈的看房购房需求&#xff0c;那么该如何全方位的了解购房信息呢&#xff1f; 房企通过VR全景展示、3D样板房、V…

论文阅读 (100):Simple Black-box Adversarial Attacks (2019ICML)

文章目录 1 概述1.1 要点1.2 代码1.3 引用 2 背景2.1 目标与非目标攻击2.2 最小化损失2.3 白盒威胁模型2.4 黑盒威胁模型 3 简单黑盒攻击3.1 算法3.2 Cartesian基3.3 离散余弦基3.4 一般基3.5 学习率 ϵ \epsilon ϵ3.6 预算 1 概述 1.1 要点 题目&#xff1a;简单黑盒对抗攻…

Vue中的图标

Vue中的图标 https://iconpark.oceanengine.com/official 官方教程&#xff1a;icon-park/vue - npm 1.IconPark 2.基本使用 下载 yarn add icon-park/vue --save 启动 yarn run serve 项目中引用 <script> import { TableFile } from icon-park/vue; export defa…

微信小程序遇到的一些问题及解决方法(设备安装)

微信小程序遇到的一些问题及解决方法 1、[js将字符串按照换行符分隔成数组](https://blog.csdn.net/pgzero/article/details/108730175)2、[vue byte数组](https://www.yzktw.com.cn/post/1202765.html)3、使用vant-weapp的文件上传capture"camera" 无法直接调用摄像…

渗透数据工程师

什么是渗透测试 渗透测试就是模拟真实黑客的攻击手法对目标网站或主机进行全面的安全评估&#xff0c;与黑客攻击不一样的是&#xff0c;渗透测试的目的是尽可能多地发现安全漏洞&#xff0c;而真实黑客攻击只要发现一处入侵点即可以进入目标系统。 一名优秀的渗透测试工程师也…

Web应用测试 —— Cookie,Session和Token

Cookie&#xff0c;Session 和 Token都是 Web 应用中常用的技术&#xff0c;它们在用户认证和状态管理中发挥了重要作用。下面是它们的基本定义和区别&#xff1a;Cookie Cookie 是服务器发送到用户浏览器并保存在浏览器上的一小块数据&#xff0c;它会在浏览器向同一服务器再次…

关于 Unity 连接 MuMu 模拟器上的 Unity Remote 5 的方法

在使用 Unity 开发 Android 的过程中&#xff0c;可以通过使用 Unity Remote 这个 app 来和真机连接&#xff0c;进而在真实环境下进行测试性能等工作&#xff0c;而本次则是由于其他问题引出的一个小坑&#xff0c;记录以备后续查询。 这次是由于在自学过程中遇到的一个工程&…

VM+Ubuntu+Xshell+Xftp安装教程

目录 VM17安装教程 检查网络连接 Ubuntu环境搭建 UBUNTU 系统配置 1、 SSH 服务器配置 服务端&#xff08;必须&#xff09; 1.安装 ssh 服务端 2.确认 sshserver 是否启动了&#xff08;看见 sshd 说明已启动&#xff09; 3.启动 sshserver 4.SSH 配置&#xff08;如果…

【Python】环境的搭建

前言 要想能够进行 Python 开发, 就需要搭建好 Python 的环境. 需要安装的环境主要是两个部分: 运行环境: Python开发环境: PyCharm 一、安装 Python 1.找到官方网站 官网&#xff1a;Welcome to Python.org 2.找到下载页面 点击download中的Windows 3.选择稳定版中的Win…

Vue+Element Progress 进度条显示文字 %修改,使用format方法显示文字可自定义

需求 要实现这样子的 将进度条里显示的文字 后的 %去掉 主要用到 format 方法 代码 <el-progress :text-inside"true" :stroke-width"30" :format"format":percentage"usageA"></el-progress>methods: {format(percent…

南大通用数据库-Gbase-8a-报错集锦-06-Stack Overflow

目录 一、数据库版本信息 二、报错信息 三、报错SQL 四、解决方法 1、修改参数thread_stack 2、改写SQL &#xff08;1&#xff09;改为内连接 &#xff08;2&#xff09;临时表 一、数据库版本信息 二、报错信息 三、报错SQL SQL包含2000多个or条件。 四、解决方法 1、…

MySQL——连接查询

2023.9.4 连接查询相关sql92语句笔记&#xff1a; #连接查询。 又称多表查询&#xff0c;当查询的字段来自多个表时&#xff0c;就会用到连接查询。 #等值连接 /* ①多表等值连接的结果为多表的交集部分 ②n表连接&#xff0c;至少需要n-1个连接条件 ③多表的顺序没有要求 ④一…

CesiumsJS加载本地离线瓦片影像地图

1.下载并安装91卫图(免费版就可以用) 2.打开软件&#xff0c;从左测选择某个区域&#xff0c;&#xff0c;在地图区双击蓝色区域&#xff0c;开始下载 3.选择影像等级&#xff0c;在【导出设置】中选择导出方式为【导出TMS瓦片】,保存格式为JPEG&#xff0c;坐标投影为【WGS84坐…

激光切割机在现代灯具的生产过程中的应用

灯饰在现代家庭装修中承担着举足轻重的角色&#xff0c;随着人类生活水平的提升&#xff0c;对家居用品的要求愈发严格&#xff0c;作为家庭装饰的必备品&#xff0c;灯饰从满足功能性需求转向追求个性化定制需求。 金属本身具有独特的质感&#xff0c;与个性化激光图案相结合&…

自然语言处理学习笔记(八)———— 准确率

目录 1.准确率定义 2.混淆矩阵与TP/FN/FP/TN 3. 精确率 4.召回率 5.F1值 6.中文分词的P、R、F1计算 7.实现 1.准确率定义 准确率是用来衡量一个系统的准确程度的值&#xff0c;可以理解为一系列评测指标。当预测与答案的数量相等时&#xff0c;准确率指的是系统做出正确判…

Flutter 通过BottomSheetDialog实现抖音打开评论区,内容自动上推、缩放效果

一、先来看下实现的效果 实现上面的效果需要解决俩个问题 当列表进行向下滑动到顶部的时候,继续滑动可以让弹窗向下收起来弹出上下拖动的时候,视图内容跟着上下移动、缩放大小二、实现弹窗上下滑动的时候,动态改变内容区的位置和大小 通过showModalBottomSheet显示底部对话框…

手写签名到背景上合为1张图

手写签名到背景上合为1张图 package.json中 "signature_pad": "3.0.0-beta.3"<template><div class"home"><canvas id"canvas" width"500" height"300"></canvas><button click"…

2.安装opencv报错及解决方法

目录 报错1&#xff1a;anaconda-lab命令不是内部外部指令 报错2&#xff1a; 找不到opencv模块,ModuleNotFoundError: No module named cv2 报错3&#xff1a;python版本号不匹配&#xff0c;Could not find a version that satisfies the requirement 报错1&#xff1a;anac…