某客户反馈,在其中一套开发环境编译存在如下报错(说明:出于信息安全考虑,相关代码均使用测试代码模拟,请勿对号入座):
"test.c", line 10.5: 1506-343 (S) Redeclaration of IsSpecialType differs from previous declaration on line 9 of "test.c".
"test.c", line 10.5: 1506-050 (I) Return type "short" in redeclaration is not compatible with the previous return type "char".
"test.c", line 10.5: 1506-377 (I) The type "double" of parameter 1 differs from the previous type "void*".
同样代码在其他开发环境不存在报错。
从直接报错提示信息看,该文件用到了 C++ 语法(函数重载),但是该文件名后缀为 .c ,默认使用 C 语言规则编译,所以会报错,涉及代码如下:
char IsSpecialType(void*);
short IsSpecialType(double);
检查用户编译文件发现,该 C 文件 (test.sqc) 由 db2 预处理 sqc 文件生成:
对 sqC 文件进行处理得到后缀为 .C 的文件;
对 sqc 文件处理得到后缀为 .c 的文件;
进一步排查,问题环境涉及到的三个 sqC 后缀文件被错误拷贝为 sqc 后缀文件(注意大小写差异),但其中两个同时拷贝了 *.o 文件。而 makefile 语法只在 sqc 文件更新的情况下会调用编译逻辑,否则如果已经存在相应的 .o 文件,不需要编译,就不会报错。因此报错只涉及 test.sqc/test.c.
其他编译正常的环境要么正确拷贝了 sqC 后缀文件,要么同时拷贝了全部 *.o 文件,因此不会报错。
据上述分析,将 test.sqc 文件名更正为 test.sqC ,编译即恢复正常。
如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!
赞1
添加新评论0 条评论