我正在将项目迁移到新的工具链,并且函数名称冲突,这是源于代码中的函数以及新工具链中包含的函数。现在,我的代码必须在旧的和新的工具链中编译,因此我不能只是破解。
例如在相同的include中,新的工具链具有已经实现的qsort函数(以及部分标准库...因此我不能只是忽略它),但是我有我自己的并希望保留我拥有的控件超过。
有没有一种方法可以删除声明(取消声明?)符号,以便改用我的项目本地的符号?
我搜索了一段时间,但没有找到解决此问题的任何策略。
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…)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句