在多个文件中重用C宏

Huc*_*kle 5 c macros c-preprocessor

我有几个常用的宏,几乎每个我写的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*
Run Code Online (Sandbox Code Playgroud)

一个更好的例子:

//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
Run Code Online (Sandbox Code Playgroud)

syn*_*tel 7

#ifndef COMMON_INCLUDE_FILE
#define COMMON_INCLUDE_FILE

#define COMMON_NUMBER 1
#define OTHER_COMMON 2

#endif
Run Code Online (Sandbox Code Playgroud)

在C中,宏比C++更普遍,你想要用静态全局做它,上面的机制是相当常见的.你在文件的主体周围放置了包含保护,并在那里定义你的公共..这本质上是config.h最终与autoconf.所以没有人可以说这不是C代码的标准机制.

只需在任何需要它的文件中包含common.h,就完成交易.