我正在将项目迁移到新的工具链,并且函数名称冲突来自函数,这些函数都位于我的代码中,并且包含在新的工具链中。我的代码现在必须在旧的和新的工具链中编译,所以我不能破解。如何在包含后删除声明
例如在同一个包含内,新的工具链已经实现了一个qsort函数(和标准库的一部分...所以我不能忽略它),但我有我自己的并希望保留一个我可以控制。
有没有办法删除声明(un-declare?)符号以便使用我的项目的本地代码?
我搜索了一段时间,还没有找到任何策略来解决这个问题。
我正在将项目迁移到新的工具链,并且函数名称冲突来自函数,这些函数都位于我的代码中,并且包含在新的工具链中。我的代码现在必须在旧的和新的工具链中编译,所以我不能破解。如何在包含后删除声明
例如在同一个包含内,新的工具链已经实现了一个qsort函数(和标准库的一部分...所以我不能忽略它),但我有我自己的并希望保留一个我可以控制。
有没有办法删除声明(un-declare?)符号以便使用我的项目的本地代码?
我搜索了一段时间,还没有找到任何策略来解决这个问题。
C标准没有提供任何方法来删除声明,我还没有听说过任何扩展。您的选项包括:
#define
和#undef
之前和之后包括任何标准头文件以将冲突的名称更改为其他内容。下面是一个例子。这违反了有关保留标识符的标准C规则,并可能导致问题,具体取决于您使用的C实现。#define
来更改标识符名称。这在技术上也违反了标准C规则,但不可能导致C实现出现问题。这需要在每个使用标识符的源文件中完成。示例如下。这里的想法是每个使用自己的qsort
标识符(或其他冲突标识符)在预处理器中被另一个不冲突的标识符替换的实例。这里的一个例子第二项:
#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…)
这是一个相当常见的问题,不幸的是它依赖于库代码的作者使用唯一的名称。 win32 windows API头文件在这方面出了名。
没有办法'undeclare'符号,但如果你使用的是C++,那么你总是可以把你的代码放在一个命名空间中以避免冲突。
另一个选项当然是简单地重命名你的函数或者将它添加到DLL/SO中,并用一个不同的名字公开一个可见的函数。
正常情况下,工具链不应该是的问题。编译器不应该为你自动包含任何东西,所以包含的内容取决于你。如果发生这种情况,则依赖于:您的#include x.h
,而新的工具链提供的x.h
也包括y.h
,而旧的工具链没有。
一个解决方案是修复你的代码:你真的不应该将名为qsort
的函数与标准库函数冲突。有没有什么能够阻止你将其重命名为my_qsort
?另一个原因是这是一个“好主意”,因为如果你的实现和stdlib之间有任何区别,你可能会遇到问题:小问题是开发者对不同行为的混淆;主要问题是对错误版本链接使用原型时不同的签名(即崩溃!)
另一种解决方案是使用身边那些只需要一个工具链头#ifdef
S,但是这可能不是在x.h
工作包括y.h
的情况。
对不起,我只是刚开始使用堆栈溢出,看不到在哪里指定的语言。 –
没问题。首先,标签很容易错过。 –