gpt4 book ai didi

C 中的 C++ 名称修饰

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:17:23 25 4
gpt4 key购买 nike

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++ 编译器后,链接将失败并出现错误“未定义对‘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 -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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com