• #ifndef的用法


    #ifndef _List_H
    #define _List_H
    
    struct Node;
    typedef struct Node *PtrToNode;
    typedef PtrToNode List;
    typedef PtrToNode Position;
    
    List MakeEmpty( List L );
    int IsEmpty( List L );
    int IsLast( Position P, List L );
    Position Find( ElementType X, List L );
    void Delete( ElementType X, List L );
    Position FindPrevious( ElementType X, List L );
    void Insert( ElementType X, List L, Position P );
    void DeleteList( List L );
    Position Header( List L );
    Position First( List L );
    Position Advance( Position P );
    ElementType Retrieve( Position P );
    
    #endif    /* _List_H */
    

    这里的#ifndef#define#endif连在一起是一个约定好的用法,其说明参见《C Primer Plus》:

    #ifndef指令通常用于防止多次包含一个文件。也就是说,应该像下面这样设置头文件:

    /* things.h */
    #ifndef THINGS_H_
       #define THINGS_H_
       /* 省略了头文件中的其他内容*/
    #endif
    

    假设该文件被包含了多次。当预处理器首次发现该文件被包含时,THINGS_H_是未定义的,所以定义了THINGS_H_,并接着处理该文件的其他部分。当预处理器第2次发现该文件被包含时,THINGS_H_是已定义的,所以预处理器跳过了该文件的其他部分。

    为何要多次包含一个文件?最常见的原因是,许多被包含的文件中都包含着其他文件,所以显式包含的文件中可能包含着已经包含的其他文件。这有什么问题?在被包含的文件中有某些项(如,一些结构类型的声明)只能在一个文件中出现一次。C标准头文件使用#ifndef技巧避免重复包含。但是,这存在一个问题:如何确保待测试的标识符没有在别处定义。通常,实现的供应商使用这些方法解决这个问题:用文件名作为标识符、使用大写字母、用下划线字符代替文件名中的点字符、用下划线字符做前缀或后缀(可能使用两条下划线)。

  • 相关阅读:
    springboot2整合seata(AT模式)
    SpringBoot2整合minio
    Minio安装(docker)、初始密码及界面操作
    elasticsearch mapper创建
    elasticsearch 中文分词
    C++11:20weak_ptr弱引用的智能指针
    C++11:19unique_ptr独占的智能指针
    C++11:18shared_ptr共享的智能指针
    C++11:17可变参数模版和type_traits的综合应用
    C++11:16可变参数模板
  • 原文地址:https://www.cnblogs.com/fanlumaster/p/13659331.html
Copyright © 2020-2023  润新知