C 语言不像 C++ 那样使用名称修饰。当函数原型(prototype)在不同文件中的声明不同时,这可能会导致细微的错误。简单的例子:

/* file1.c */
int test(int x, int y)
{
    return y;
}

/* file2.c */
#include <stdio.h>

extern int test(int x);

int main()
{
    int n = test(2);
    printf("n = %d\n", n);
    return 0;
}

使用 C 编译器(在我的示例中为 gcc)编译此类代码时,不会报告错误。切换到 C++ 编译器后,链接将失败并显示错误“undefined reference to 'test(int)'”。不幸的是,在实践中这并不容易 - 有时代码被 C 编译器接受(带有可能的警告消息),但在使用 C++ 编译器时编译失败。

这当然是糟糕的编码实践 - 所有函数原型(prototype)都应该添加到 .h 文件中,然后将其包含在实现或使用函数的文件中。不幸的是,在我的应用程序中有很多这样的情况,并且在短期内修复所有这些情况是不可能的。切换到 g++ 也不行,我很快就遇到了编译错误。

一种可能的解决方案是在编译 C 代码时使用 C++ 名称修饰。不幸的是 gcc 不允许这样做 - 我没有找到执行此操作的命令行选项。您知道是否可以这样做(也许使用其他编译器?)。我也想知道一些静态分析工具是否能够捕捉到这一点。

最佳答案

使用 splint 可以捕获这些类型的错误。

foo.c:

int test(int x);
int main() {
    test(0);
}

酒吧.c:
int test(int x, int y) {
    return y;
}

运行 splint :
$ splint -weak foo.c bar.c
Splint 3.1.2 --- 20 Feb 2009

bar.c:1:5: Function test redeclared with 2 args, previously declared with 1
  Types are incompatible. (Use -type to inhibit warning)
   foo.c:4:5: Previous declaration of test

Finished checking --- 1 code warning

关于C++ 中的 C 名称修改,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25044183/

10-16 07:32