这个宏定义是做什么用的?
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
{
};
我是嵌入式代码的新手,正在阅读 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
{
};