2013-11-22 79 views
2

我正在将项目迁移到新的工具链,并且函数名称冲突来自函数,这些函数都位于我的代码中,并且包含在新的工具链中。我的代码现在必须在旧的和新的工具链中编译,所以我不能破解。如何在包含后删除声明

例如在同一个包含内,新的工具链已经实现了一个qsort函数(和标准库的一部分...所以我不能忽略它),但我有我自己的并希望保留一个我可以控制。

有没有办法删除声明(un-declare?)符号以便使用我的项目的本地代码?

我搜索了一段时间,还没有找到任何策略来解决这个问题。

回答

1

C标准没有提供任何方法来删除声明,我还没有听说过任何扩展。您的选项包括:

  • 重命名源代码中与标准库标识符冲突的标识符。这就是你应该做的。
  • 使用#define#undef之前和之后包括任何标准头文件以将冲突的名称更改为其他内容。下面是一个例子。这违反了有关保留标识符的标准C规则,并可能导致问题,具体取决于您使用的C实现。
  • 使用#define来更改标识符名称。这在技术上也违反了标准C规则,但不可能导致C实现出现问题。这需要在每个使用标识符的源文件中完成。示例如下。这里的想法是每个使用自己的qsort标识符(或其他冲突标识符)在预处理器中被另一个不冲突的标识符替换的实例。
  • 您可以修改C实现中的头文件。这几乎总是一个坏主意。我提到它只是为了包含所有可能性。 (另一种可能性,我不包括,因为它是一个更糟糕的想法,就是你可以修改C实现提供了新的扩展,消除声明的源代码。)

这里的一个例子第二项:

#define qsort StandardLibraryQsortRenamedDueToConflict 
#include <stdlib.h> 
#undef qsort 

这里是第三项的例子:

#include <stdlib.h> 
#define qsort MyQsort 
#include "MyHeader.h" 

如果你有你自己的头文件之一后,标准的头文件,你不能对它们重新排序,则必须使用#undef,以避免与标准头文件的干扰:

#define qsort MyQsort 
#include "MyHeader0.h" 
#undef qsort 
#include <stdlib.h> 
#define qsort MyQsort 
#include "MyHeader1.h" 

如果没有一个标准的头文件后,在任意源文件中的任何您的麻烦头文件中包含的话,而不是插入上述每一个源文件,你可以只需将每个#define放置在其相应的头文件中即可。所以MyHeader.h可能看起来像:

… // Various code. 
#define qsort MyQsort 
void qsort(parameter…) 
0

这是一个相当常见的问题,不幸的是它依赖于库代码的作者使用唯一的名称。 win32 windows API头文件在这方面出了名。

没有办法'undeclare'符号,但如果你使用的是C++,那么你总是可以把你的代码放在一个命名空间中以避免冲突。

另一个选项当然是简单地重命名你的函数或者将它添加到DLL/SO中,并用一个不同的名字公开一个可见的函数。

+0

对不起,我只是刚开始使用堆栈溢出,看不到在哪里指定的语言。 –

+0

没问题。首先,标签很容易错过。 –

2

正常情况下,工具链不应该是的问题。编译器不应该为你自动包含任何东西,所以包含的内容取决于你。如果发生这种情况,则依赖于:您的#include x.h,而新的工具链提供的x.h也包括y.h,而旧的工具链没有。

一个解决方案是修复你的代码:你真的不应该将名为qsort的函数与标准库函数冲突。有没有什么能够阻止你将其重命名为my_qsort?另一个原因是这是一个“好主意”,因为如果你的实现和stdlib之间有任何区别,你可能会遇到问题:小问题是开发者对不同行为的混淆;主要问题是对错误版本链接使用原型时不同的签名(即崩溃!)

另一种解决方案是使用身边那些只需要一个工具链头#ifdef S,但是这可能不是在x.h工作包括y.h的情况。