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

原文链接: https://www.cnblogs.com/pandamohist/p/13716311.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    c++代码编译错误查找方法之宏

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/203183

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月12日 下午9:25
下一篇 2023年2月12日 下午9:25

相关推荐