从表示不同值的不同文件中访问C中的相同宏

时间:2016-10-03 11:25:27

标签: c file macros header embedded

我有两个不同的头文件,两者都有相同的宏,表示一些方程式。例如;我在function1.h和function2.h中都有F1,但这两个代表了两个不同的方程式。在某些情况下,我需要使用function1.h中的F1,而在其他情况下我将需要来自function2.h的F1。我怎么可能在C中实现这个逻辑。

//function1.h
#define F1 x+10
#define F2 x*10
//function2.h
#define F1 x+210
#define F2 x*99

//main.c
#include "function1.h"
#include "function2.h"

int x = 10;

if(..something..)
return(F1)       //from function1.h
if(..something..else..)
return(F1)       //from function2.h

//无论如何都要毫不含糊地实现这种逻辑

2 个答案:

答案 0 :(得分:0)

如果他们做了不同的事情,他们应该以不同的方式命名(如果他们是你所建议的不同方程的“速记”,他们就是这样)。预编译器操作可能正在做一些你不期望的事情。因此,例如,如果第二个头文件与第一个头文件在同一个源文件中列出,则实际上可能会将F1替换为第一个中相同宏名称的别名代码。这可能会给你一个编译错误。

请记住,预编译器只是将宏标签替换为宏标签“别名”的代码。这是编译的源代码。你可能知道这一点,但有些人认为宏是某种功能命名法。

#define F1 x+10
#define F2 x*10
//function2.h
#define F1 x+210
#define F2 x*99

更改为:

#define F1(A) x+A
#define F2(A) x*A

在每种情况下,您不需要两个不同的宏。你不应该做你现在正在做的事情 - 见前一段。

使用:

return(F1(10));

return(F1(210));

视情况而定。

答案 1 :(得分:0)

不能做到这一点就是简短的回答。我怀疑这个答案很长,但是这里也是如此。

因为它们是宏,所以可以取消定义它们。由于这些是预先存在的标题,因此它们可能会有其他冲突定义 - 因此您必须取消相当多的定义。

该代码看起来像这样

#include "function1.h"
int my_function1_f1(int x)
{
    return F1(x);
}
#undef F1
// You would probably have to undefine a lot more here

#include "function2.h"
int my_function2_f1(int x)
{
    return F1(x);
}
#undef F2 // Do this for neatness

然后你可以拨打"右键"使用my_function1_f1()或my_function2_f1()的F1版本。

更好的答案是创建其他源文件,一个用于访问function1.h中的函数,另一个用于访问function2.h中的函数。

有了这个,你可以愉快地包含两个新的标题作为冲突函数。只会包含在myfunction1.c中,而function2.h只会包含在myfunction2.c中。