【背景】最近做一个项目,需要使用到凌华的运动控制卡和IO卡,在测试工程中,使用的类和引用的库文件都一切正常。
测试完成后,本着可重复移植的考虑,将整个文件夹添加到现有工程中,却出现了非常奇怪的编译错误。
【分析】这些文件在测试工程中是没有问题的,因此这个错误肯定不是语法上的错误。
点击错误行,指向了凌华厂家提供的头文件!
测试工程没有问题,加入到项目工程却出现了问题,显然与项目工程的文件有关。
由于是编译错误,
首先怀疑是重复包含的问题,在每个文件头加入了#pragma once,问题仍然存在。
其次怀疑是文件的包含路径问题,不过路径不对报错不应该是这个报错。将#include "Stdafx.h"放到最前,并且确保路径正确。问题依旧。
由于错误指向是厂家提供的头文件,一直没有怀疑头文件的问题。反反复复折腾了很久。
网上查找该错误信息,排查了多种干扰可能后,发现了一个有价值的。
error C2143: 语法错误 : 缺少“)”(在“常量”的前面)_缺少在常量的前面_清水迎朝阳的博客-CSDN博客
作者的场景与我的十分相像!
【解决】正式把怀疑对象锁定到厂家头文件上!
首先把错误指向的函数及其引用屏蔽,重新编译项目工程。果然,编译通过了!
可是,被屏蔽的函数是需要使用的,不能屏蔽掉。
再一个个修改函数的宏和参数名称,最终确定,居然是函数的一个参数名称出现了问题!
将参数名称按照如下修改后,问题就解决了!
再去工程中查找原来的函数参数名称,果然发现了一个与之同名的宏定义!
至此,原因也分析清楚了。
【总结】
这是一个非常隐蔽的问题,也是一个简单的编译问题,却耗费了大量的时间进行分析。除了希望VS能提示的更加清晰以外,我想还有以下收获:
1、永远可以相信编译器给出的提示,循着提示去找问题就对了。
2、定义宏的时候一定要用大写,与定义函数变量要有所区分。