繁体   English   中英

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

[英]Accessing same macro in C, from different files representing different values

我有两个不同的头文件,两者都有相同的宏,表示一些方程式。 例如; 我在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

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

如果他们正在做不同的事情,他们应该被命名为不同的(如果他们是你所建议的不同方程式的“速记”,他们就是这样)。 预编译器操作可能正在做一些你不期望的事情。 因此,例如,如果第二个头文件与第一个头文件在同一个源文件中列出,则实际上可能会将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));

视情况而定。

不这样做是简短的回答。 我怀疑答案的长期是一样的,但是这里也是如此。

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

该代码看起来像这样

#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中的函数。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM