c++代码编译错误查找方法之宏
1.关于
- 本文演示环境: win10+vs2017
- 好久不用这法子了,都快忘了
- 排查错误,思路很重要,且一定要思路清晰(由于自己思路不清晰,查找错误耽误了不少时间,其实问题很简单,只是你要找到他需要不少时间):
A、确定是 语法问题 还是 编码问题 (观察错误提示信息)
B、语法问题: 从出错的地方开始 向上查找,逆向找,遇到 #include "xxx.h",打开该文件,并检查其语法: {}的配对, #idfef与#endif的配对使用......
C、编码问题: 统一编码
2. 错误
- 2.1 错误描述
3>C:\Users\xxxxxx\Desktop\serial_port\include\serial_port/serial_port_win_info.h(9): error C2059: 语法错误:“namespace”
3>C:\Users\xxxxxx\Desktop\serial_port\include\serial_port/serial_port_win_info.h(10): error C2143: 语法错误: 缺少“;”(在“{”的前面)
3>C:\Users\xxxxxx\Desktop\serial_port\include\serial_port/serial_port_win_info.h(10): error C2447: “{”: 缺少函数标题(是否是老式的形式表?)
3>C:\Users\xxxxxx\Desktop\serial_port\src\serial_port_interface.cpp(57): error C2888: “lib_sp::serial_port_info lib_sp::serial_port_info::get_instance(void) noexcept”: 不能在命名空间“lib_sp”内定义符号
3>C:\Users\xxxxxx\Desktop\serial_port\src\serial_port_interface.cpp(66): error C2888: “std::list<lib_sp::sp_name_desc,std::allocator<_Ty>> lib_sp::serial_port_info::get_info(void) noexcept”: 不能在命名空间“lib_sp”内定义符号
3> with
3> [
3> _Ty=lib_sp::sp_name_desc
3> ]
3>C:\Users\xxxxxx\Desktop\serial_port\src\serial_port_interface.cpp(68): error C2653: “serial_port_win_info”: 不是类或命名空间名称
3>C:\Users\xxxxxx\Desktop\serial_port\src\serial_port_interface.cpp(68): error C2065: “get_info”: 未声明的标识符
3>C:\Users\xxxxxx\Desktop\serial_port\include\serial_port/serial_port_win_base.h(47): fatal error C1075: “{”: 未找到匹配令牌
.......
2.2 起初认为是自己将代码从Ubuntu拷贝到win后,编码错乱引起的,仔细检查代码语法后,无误。于是用记事本将所有涉及到自己写的头文件和源文件全部改为统一的格式utf-8(非utf-8-带签名65001),再编译,还是不行 。
2.3 因为涉及到一份代码,Ubuntu和windows切换使用,所以,当Ubuntu编译通过后,误认为windows相关的代码无误,毕竟首先是在Windows上完成的第一版开,再拷贝到Ubuntu的。
2.4 经过一系列神奇操作(因为涉及到多平台,于是将涉及到平台的宏全部屏蔽,再次编译,发现通过编译),排除非编码的问题,回到原点,重新审查代码。
2.5 重点, 再次打开Windows相关的宏,再次编译,发现报错,确定:关于Windows的代码出现问题。
2.6 回溯第一个错误,从报错的第9行开始想上找,发现包含一个头文件,打开该头文件,发现类的一个函数log忘记了写},将缺少的}补回后,再次编译: 成功。 错误代码如下
template<typename FormatString, typename... Args>
void log(const FormatString &fmt, const Args &... args) noexcept
{
#ifdef use_spdlog
if (_sp_param._spp._is_to_log)
{
if (_sp_param._plog)
_sp_param._plog->info(fmt, args...);
}
} // endif应该放在这个里面,而不是外面
#endif //! use_spdlog
Note: 错误的地方是#endif //! use_spdlog上面一行,错误的将 } 放入了#endif中
c++代码编译错误查找方法之宏的更多相关文章
- PowerDesginer 生成的Oracle 11g 组合触发器代码编译错误(29): PLS-00103
问题描述: 采用PowerDesigner15针对Oracle 11g 创建物理数据模型,想实现一个字段的自增,采用如下步骤: 1.创建序列,命名为Sequence_1; 2.在自增字段编辑窗口中,选 ...
- 减少C++代码编译时间的方法
c++ 的代码包含头文件和实现文件两部分, 头文件一般是提供给别人(也叫客户)使用的, 但是一旦头文件发生改变,不管多小的变化,所有引用他的文件就必须重新编译,编译就要花时间,假如你做的工程比较大(比 ...
- Maven常见异常及解决方法---测试代码编译错误
[ERROR] Please refer to E:\maven\web_nanchang\target\surefire-reports for the individual test result ...
- VS C4819 编译错误解决方法
偶尔用别人的代码,出现: warning C4819: The file contains a character that cannot be represented ). Save the fil ...
- 解决TensorFlow最新代码编译错误问题
老是有个习惯,看到开源代码更新了,总是想更新到最新版,如果置之不理的话,就感觉自己懒惰了或有的不负责任了,这个也可能是一种形式的强迫症吧: 前几天晚上git pull TensorFlow,完事后也没 ...
- Android Studio中解决jar包重复依赖导致的代码编译错误
在原本的代码中已经使用了OKHTTP和rxjava,然后今天依赖retrofit的时候一直报错 Program type already present: okhttp3.internal.ws.Re ...
- Cordova - 安装camera插件之后编译错误解决方法!
安装camera插件之后,编译出错,错误截图如下: 刚开始以为是AAPT编译导致的,尝试关闭AAPT编译选项,但是不行,认真看了一下编译出错信息,应该是缺少文件导致的,随后在对应的目录中加入了缺失的文 ...
- CentOS 7 编译错误解决方法集合
解决 error: the HTTP XSLT module requires the libxml2/libxslt 错误 yum -y install libxml2 libxml2-dev yu ...
- C编译错误解决方法
1.expected identifier before numeric constant 一般情况下是枚举类型中的某个变量已经被#define定义过一次了,在项目空间中搜索你枚举类型中的所有变量类型 ...
随机推荐
- Atom编辑器速查
简介 Atom 是 Github 开源的文本编辑器,相当于半个IDE.其特点如下: (1)免费开源,多平台支持(Windows.Mac.Linux): (2)界面美观.现代化,使用舒适: (3)多文件 ...
- Macbookpro快捷键
Alt键代替 Option 键,用 Windows 标志键代替 Command 键. 但是,使用的时候,Command健类似于Windows的Control键. 1.复制.粘贴.剪切.全选.查找 Co ...
- windows下typora图片自动上传到图床(附带腾讯云教程)
目录 1. 背景 2. 在Typora中使用 3. 安装 3.1 安装教程环境说明 3.2 安装步骤 3.3 配置图床 3.3.1 插件配置 3.3.2 腾讯云参数获取 3.3.2.1 新建子用户,获 ...
- MariaDB——简介
一.MariaDB跟MySQL在绝大多数方面是兼容的,对于开发者来说,几乎感觉不到任何不同.是MySQL的代替品. MariaDB虽然被视为MySQL数据库的替代品,但它在扩展功能.存储引擎以及一些新 ...
- cp -拷贝文件出现错误
对于cp -a最主要的用法是在保留原文件属性的前提下复制文件. 如果出现了拷贝文件错误,在文件前面加上-a 即可
- Vector总结及部分底层源码分析
Vector总结及部分底层源码分析 1. Vector继承的抽象类和实现的接口 Vector类实现的接口 List接口:里面定义了List集合的基本接口,Vector进行了实现 RandomAcces ...
- 【Python机器学习实战】聚类算法(1)——K-Means聚类
实战部分主要针对某一具体算法对其原理进行较为详细的介绍,然后进行简单地实现(可能对算法性能考虑欠缺),这一部分主要介绍一些常见的一些聚类算法. K-means聚类算法 0.聚类算法算法简介 聚类算法算 ...
- Ubuntu 14.04 升级到 Ubuntu16.04
Ubuntu 14.04 升级到 Ubuntu16.04 1). 更改source.list 源 (24条消息) Ubuntu16.04 source.list更改源_dylan的博客-CSDN博客_ ...
- Redis6 新特性
Redis6新特性 ACL安全策略 ACL(access control list): 访问控制列表,可以设置多个用户,并且给每个用户单独设置命令权限和数据权限 default用户和使用require ...
- 大数据学习day16------第三阶段-----scala04--------1. 模式匹配和样例类 2 Akka通信框架
1. 模式匹配和样例类 Scala有一个十分强大的模式匹配机制,可以应用到很多场合:如switch语句.类型检查等.并且Scala还提供了样例类,对模式匹配进行了优化,可以快速进行匹配 1.1 模式匹 ...