目前我正在尝试在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;。这应该很容易,但我有一些疑问:
此代码是否意味着它可以是C和C ++的头文件:
#ifdef __cplusplus
extern "C" {
#endif
当我在这里包含图书馆时,我应该放在&#34; extern "C"
&#34;还是之后呢?这个订单对他们有用吗?
答案 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,但就你的例子而言:
答案 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>
之前的