#define 包含头文件 C++

#define to include header file c++

本文关键字:C++ 文件 包含头 #define      更新时间:2023-10-16

我觉得自己对#define的语法有点迷茫。例如,我们可以header文件包含为

#include "header.h"

但我做了一些逻辑实验,发现

#define header

导致相同的结果。因此

#define header_H
#define _header_H_

你能说说它们之间有什么区别吗?通过#define包含文件的整个想法看起来很有趣,前提是我们有#include.这个标志_是什么意思?我在预处理器教程中没有找到它的定义。

我的假设是,您的困惑是包含守卫使用任何名称的原因。_(下划线)除了是有效的标识符外没有任何意义*,名称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

* 不鼓励使用下划线作为前缀,因为它保留给实现。

#include "header.h"

这被编译器替换为 header.h 的代码。

#define header

这只是定义了一个"标记"(不知道如何称呼它)。它可以在一些类似的代码中使用

#ifdef header 
    puts("It is defined!");
#else
    puts("Oh no!");
#endif

下划线可用于变量的名称,也可用于定义。除了系统库中使用的许多函数都以下划线开头这一事实之外,它们没有任何意义。因此,编写一个名为 _exit 的函数会导致很多问题,因为有一个重要的系统调用称为这样。

如果define在你的情况下像include一样工作,那么我可以猜到你的编译器喝醉了,或者你在代码中的其他地方#include "header.h"了。

使用 #include 就可以做到这一点,将文件包含在您的项目中。但是,C++编译器不够聪明,无法理解您是否使用两次#include samefile,因此,它将添加相同的文件两次。这是进来#define。如果尚未包含#ifndef __FILE__,则使用#define __FILE__,以便编译器知道它已被包含。