如何忽略define指令?

时间:2014-11-25 12:33:40

标签: c gcc c-preprocessor pragma

我有以下问题。我正在编写依赖于他人代码的 C 代码,而我无法对其进行更改。并且在该代码中(我不允许更改)是 define 预处理器指令。我的代码是在另一段代码之前编译的。我需要一种方法来规避这一点,以便我的代码不受此 define 指令的影响。

有没有办法告诉预处理器从现在开始忽略所有指令?

对我来说几乎起作用的是以下pragma毒药指令,但遗憾的是这引发了错误。有没有办法抑制这个错误?

#pragma GCC poison define

我知道这不是一个容易回答的问题,但我真的很感激一些帮助。

2 个答案:

答案 0 :(得分:0)

您编写的预处理程序指令在其他指令之前运行,因此当时没有定义任何内容。

在这种情况下,我认为唯一的解决方案是使用您自己的脚本在预处理器阶段之前预处理文件,并将定义的值更改为适合您需要的内容,并且不会对您的代码产生影响。我认为没有更好的解决方案。

答案 1 :(得分:0)

我认为您可以执行以下操作:假设问题是其他代码将string定义为char *以及您需要包含的标头中的某个位置。您可以在其他代码的包含之后在c文件中定义:

#ifdef string
    #undef string
#endif

如果您的代码每次包含相同的标题,您可以将所有包含放在一个标题中并在结尾处对其进行清理:示例可以是other_include.h

#ifndef _OTHER_INCLUDE_H
#include <otherheader_a.h>
#include <otherheader_b.h>
#include <otherheader_c.h>

/*Sanitize string definition */

#ifdef string
    #undef string
#endif
#endif /* _OTHER_INCLUDE_H */

如果您不是很幸运,您必须创建一个sanitize.h标题,并在c个文件中包含所有其他标题后将其包含在内。

此外,如果您需要部分代码禁用宏并在以下后恢复:

#ifdef string
    #define _temp_string string
    #undef string
#endif

当你想要恢复时

#ifdef _temp_string
    #define string _temp_string
    #undef _temp_string
#endif

这不是很优雅,但你可以用它作为细粒子来使你的子程序安全。