我是嵌入式代码的新手,正在阅读恩智浦的示例代码,该示例是为FRDM-KL25Z编写的。在文件main.h中,我不知道这一行:
#ifndef MAIN_H_
#define MAIN_H_
#endif /* MAIN_H_ */
用于什么?我认为也许它定义了main.h的名称是MAIN_H_?但是这个定义的目的是什么?在文件main.c
中,它仍然include main.h
如下:
#include "main.h"
答案 0 :(得分:1)
假设我有一个这样的头文件:
// foo.h
struct Foo
{
};
然后我不小心将其包含两次:
#include "foo.h"
#include "foo.h"
最终将尝试编译以下内容,这将生成错误...
struct Foo
{
};
struct Foo //< error 'Foo' declared twice
{
};
解决此问题的一种方法是让预处理器删除第二次出现,然后为每个头文件定义一个唯一的标识符。例如
#ifndef FOO_H_
#define FOO_H_
struct Foo
{
};
#endif
现在,如果我们不小心将其包含两次...
#ifndef FOO_H_ //< not yet declared
#define FOO_H_ //< so declare it
struct Foo
{
};
#endif
#ifndef FOO_H_ //< this time FOO_H is defined...
#define FOO_H_ //< ... so DO NOT include this code.
struct Foo
{
};
#endif
尽管我个人建议通过略微的非标准(尽管大多数(如果不是全部)编译器支持)来实现相同的目的。
#pragma once //< only ever include this file once
struct Foo
{
};