我有一些常用的宏,几乎每个我写的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
答案 0 :(得分:7)
#ifndef COMMON_INCLUDE_FILE
#define COMMON_INCLUDE_FILE
#define COMMON_NUMBER 1
#define OTHER_COMMON 2
#endif
在C中,宏比C ++更普遍,你想要用静态全局做它,上面的机制相当普遍。你在文件的主体周围放置了包含保护,并在那里定义你的公共..这基本上是config.h
最终与autoconf的关系。所以没有人能说这不是C代码的标准机制。 / p>
只需将common.h包含在需要它的任何文件中,完成交易。
答案 1 :(得分:2)
您最应该将常用宏放在整个项目的单个标题中:代码重复是一件危险的事情,会让您的维护成本降到最低点。
您看到的警告可能与多次包含相同的标头有关。您需要使用include guards来避免它们。
编辑(回答问题更新)
您的包含警卫的实施缺失#define USEFULMACROS
。它应该如下:
//usefulmacros.h
#ifndef USEFULMACROS
#define USEFULMACROS
#define V4(str, ...) if(optv >= 4){printf("%s: "str,prog,__VA_ARGS__);}
#endif
答案 2 :(得分:0)
您所描述的是实现目标的方式。什么警告?如果是多重定义,您只想保护文件,如下面的答案中所述: While using #ifndef, .h file being added multiple times
答案 3 :(得分:0)
使用#ifndef检查USEFULMACROS宏定义,但是没有在任何地方定义它。
您必须添加
行#define USEFULMACROS
后
#ifndef USEFULMACROS