我觉得自己对#define
的语法有点迷茫。例如,我们可以将header
文件包含为
#include "header.h"
但我做了一些逻辑实验并发现了
#define header
导致相同的结果。因此,
#define header_H
#define _header_H_
请问,请说出所有这些之间有什么区别?通过#define
包含文件的整个想法看起来很有趣,前提是我们有#include
。这标志_
是什么意思?我没有在预处理器教程中找到它的定义。
答案 0 :(得分:3)
我的假设是,你的困惑是为什么包含警卫可以使用任何名字。 _
(下划线)没有意义*除了它是有效的标识符之外,名称header_H
只是设计为唯一的,因此标题的内容只编译一次而不会导致重复符号的问题。虽然这是不好的做法,但您的包含警示可能是#define a
,#define abc
或任何其他未保留的有效字母数字组合。
#ifndef HEADER_H //<- as I mentioned could be anything valid and not reserved
#define HEADER_H //<- Now this must be the same to work properly
... // defines
#endif
* 不建议使用下划线作为执行保留。
答案 1 :(得分:1)
#include "header.h"
编译器将其替换为代码header.h
。
#define header
这只是定义了一个'标记'(不知道如何调用它)。它可以在某些代码中使用
#ifdef header
puts("It is defined!");
#else
puts("Oh no!");
#endif
下划线可以用在变量的名称中,也可以用在定义中。它们没有任何意义,除了系统库中使用的许多函数都以下划线开头。因此,编写一个名为_exit
的函数会导致很多问题,因为有一个像这样的重要系统调用。
如果define
在您的情况下与include
类似,那么我可以猜测您的编译器已经醉了,或者您的代码中的其他位置#include "header.h"
。
答案 2 :(得分:1)
使用#include
就可以了,将文件包含在项目中。但是,如果你使用#include samefile
两次,C ++编译器就不够聪明,因此,它会两次添加相同的文件。这是#define
进来的。如果尚未包含#ifndef __FILE__
,则使用#define __FILE__
和{{1}},以便编译器知道它已包含在内。