这个宏定义是做什么用的?

What is this macro define for?

我是嵌入式代码的新手,正在阅读 NXP 的示例代码,此示例是为 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"

假设我有一个这样的头文件:

// 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 
{
};