2

考虑代码。

#ifndef FOO_H
#define FOO_H
//Code
#endif

代码可以是以下情况

// Case 1: 
#define foo 0
// Case 2:
void foo_method(){};
// Case 3:
int foo;

foo.h包含在许多 C 文件中。当我只编译 case 1 没有错误时,其他情况会抛出重复错误。

为什么foo.h除了编译时没有连接到 C 文件时会这样?

4

1 回答 1

7

关于案例 2:
您应该只声​​明函数签名,而不是主体。它与预处理器命令无关。

在头文件中(仅声明)

#if <Condition>
void foo();
#endif

在 C 文件中

#if <Condition>
void foo(){
   //body
}

#endif

关于 case 3:
和 case 2 类似,另外如果变量是extern则需要在头文件中声明,否则不需要在头文件中声明。如果它们声明为 extern,它们还需要在没有 extern 关键字的 C 文件中声明:

在头文件中:

#if <Condition>
extern int bar;
#endif

在 C 文件中:

#if <Condition>
int bar;
#endif
于 2015-09-30T14:33:37.103 回答