C标题定义顺序/位置

时间:2017-09-07 02:38:37

标签: c++ c header

目前我正在尝试在C头文件中包含库。 这是原始代码的样子:

#ifndef SIMULATE_H
#define SIMULATE_H

#ifdef __cplusplus
extern "C" {
#endif

#define RAM_SIZE 16320
#define STRING_SIZE 10
#define BUFFER_SIZE 100
long final_hex[RAM_SIZE];
char zero[STRING_SIZE];
char stringValue[STRING_SIZE];
char buffer[BUFFER_SIZE];
char checksum[BUFFER_SIZE];

#ifdef __cplusplus
}
#endif

#endif /* SIMULATE_H */

我想要包含的是&#34; #include <math.h>&#34;。这应该很容易,但我有一些疑问:

  1. 此代码是否意味着它可以是C和C ++的头文件:

    #ifdef __cplusplus
    extern "C" {
    #endif
    
  2. 当我在这里包含图书馆时,我应该放在&#34; extern "C"&#34;还是之后呢?这个订单对他们有用吗?

3 个答案:

答案 0 :(得分:3)

我将专注于此代码的另一个方面:

long final_hex[RAM_SIZE];

全局数据结构需要在头文件中定义为extern。否则,包含标题的每个源文件将尝试定义其自己的结构副本,这将导致链接时出错(可能是“符号final_hex的多个定义”)。< / p>

答案 1 :(得分:2)

首先,你可能意味着#include not #define。

extern "C" makes a function-name in C++ have 'C' linkage

如果你检查math.h,你会发现它有自己的

#ifdef __cplusplus
extern "C" {
#endif
//...
#ifdef __cplusplus
}
#endif

部分。最好不要在外部包含外部标题&#34; C&#34;部分。

这是一个很好的基本explanation about includes,但就你的例子而言:

  • 目前没有任何区别,如果你在extern之前或之后包括&#34; C&#34;部分,因为你没有在标题中使用任何东西
  • 如果你使用外部标题,你应该在使用前将它包含在顶部,否则你会收到错误
  • 如果您不打算使用math.h中的任何定义或类型,则不需要嵌套包含并创建无用的依赖项,这在项目较小时并不重要,但会增加大型项目的构建时间 - 您应该在源文件
  • 之上单独包含这些文件

答案 2 :(得分:2)

我没有添加评论的声誉,但我很好奇你是否想要添加

#include <math.h>

而不是

#define <math.h>

我会假设你的意思是#include

当您需要使用该库中定义的内容(如函数或结构)时,可以包含math.h等其他库。

对于#include语句,预处理器会将#include行替换为math.h文件的内容。

当文件中的某些内容引用头文件中的某些内容时,您应该只包含一个头文件。就我所见,您发布代码的头文件没有引用math.h中的任何内容,因此您不应将其包含在该文件中。

相反,您应该拥有使用simulate.h文件中的声明的源文件(* .c),并且假设math.h包含这两个文件。

#include "simulate.h"
#include <math.h>

int main(void) {
    double root = sqrt(25.0); /* from math.h */
    int n = STRING_SIZE;      /* from simulate.h */
}

就您的第一个问题而言,#ifdef _cplusplus只是预处理器的条件编译指令。如果定义了变量_cplusplus(使用C ++编译器),那么它将在#ifdef / #endif段之间添加代码;否则就不会。

如果你确实在mathulate.h文件中包含了math.h文件,那么假设你以后不在simulate.h中引用数学中的某些内容,那么它的位置应该无关紧要。 h #include <math.h>之前的