2012-03-05 67 views
5

我有几个常用的宏,这些宏在我写的每个C文件中都是普遍需要的。目前我正在将它们复制到每个需要它们的文件中。这可能是一个糟糕的主意,因为我最终需要更改其中一个文件,然后最终导致文件之间不一致的宏。在几个文件中重用C宏

有没有一种方法可以为宏创建一个头文件?我试图制作一个包含所有宏的头文件,但仍然收到编译器警告。

更新: 我得到的具体警告是函数的隐式声明,如第二个示例中的V4。

一个例子:

//file1.c 
#define COMMON_NUMBER 1 

//file2.c 
#define COMMON_NUMBER 1 

//... 

//fileN.c 
#define COMMON_NUMBER 1 

//Oh wait, it should have been 2 all along..... *facepalm* 

一个更好的例子:

//file1.c 
#include "usefulmacros.h" 

char* prog; 
int optv; 

int main(){ 
    prog = strdup(argv[0]);  
    optv = 4;   // This would be parsed from # of "-v" in argv[] 
    return 0; 
} 

void functionA(){ 
    int dumberror = 1; 
    V4("This is a fairly verbose error: %d",dumberror); 
} 

//file2.c 
#include "usefulemacros.h" 
extern char* prog; 
extern int optv; 

void functionB(){ 
    int differror = 2; 
    V4("This is a different error: %d",differror); 
} 

//usefulmacros.h 
#ifndef USEFULMACROS 
#define V4(str, ...) if(optv >= 4){printf("%s: "str,prog,__VA_ARGS__);} 
#endif 
+6

你在这里谈论什么样的警告?我们猜猜看? – 2012-03-05 20:30:06

+1

如果您还没有听说过,那么宏是最好的工具的作业非常少,而且它们可能会导致很多问题。例如,这个'COMMON_NUMBER'可能是一个'const'全局变量(或更好)。 – Beta 2012-03-05 20:32:53

+0

@JeffMercado:我用一个更好的例子更新了我的问题,这个例子更具体地说明了发生了什么。 – Huckle 2012-03-05 21:13:08

回答

6
#ifndef COMMON_INCLUDE_FILE 
#define COMMON_INCLUDE_FILE 

#define COMMON_NUMBER 1 
#define OTHER_COMMON 2 

#endif 

在C,其中宏是一个小更普遍比C++,你会想用一个静态全局做到这一点,上述机制是相当普遍的。你在文件的主体周围放置了包括守卫,并在那里定义你的commons。这实质上就是config.h最终被autoconf所取代。所以没人能说这不是C代码的标准机制。

只需将common.h包含在任何需要它的文件中,完成处理。

+0

我知道#idndef /#define /#endif结构,我在我的问题中添加了更多详细信息。 – Huckle 2012-03-05 21:14:19

+0

这与我发布的答案仍然相同,请注意,您的问题_still_缺少重要的'#ifndef COMMON_INCLUDE_FILE \ n #define COMMON_INCLUDE_FILE \ n \ n #endif \ n'..具体来说,头部守卫这会阻止您的包含被多次预处理(并且是您的重复定义错误的原因。)在随后的“包含”中,如果定义了COMMON_INCLUDE_FILE,它将不会重新预处理它。 – synthesizerpatel 2012-03-06 01:16:06

2

你应该最肯定把你常用的宏在一个标题为您的整个项目:代码重复是一件危险的事情,使您的维护成本将通过屋顶。

您看到的警告可能与多次包含相同标题有关。您需要使用include guards来避免它们。

编辑(在回答这个问题更新)

你实现包括警卫缺少#define USEFULMACROS。它应该是如下:

//usefulmacros.h 
#ifndef USEFULMACROS 
#define USEFULMACROS 
#define V4(str, ...) if(optv >= 4){printf("%s: "str,prog,__VA_ARGS__);} 
#endif 
0

您使用#ifndef检查USEFULMACROS宏定义,但您没有在任何地方定义它。

您必须添加行

#define USEFULMACROS 

#ifndef USEFULMACROS