2016-02-19 1 views
0

Неправильно ли положить #endif в начале файла заголовка C++ после #ifndef и #define? Если да, то почему?Почему #endif включен в конце страницы .h?

This question не затрагивает причины, по которым #endif находится в конце, - это именно то, к чему я стремился.

Например

//cDate.h 
#ifndef CDATE_H_EXISTS 
#define CDATE_H_EXISTS 

#include <string> 


class cDate { 
    private: 
    std::string day; 
    std::string month; 
    std::string year; 
    public: 
    void setDate(std::string, std::string, std::string); 
    std::string getDate(int); 
}; // end class def 

#endif 

против

//cDate.h 
    #ifndef CDATE_H_EXISTS 
    #define CDATE_H_EXISTS 
    #endif 

    #include <string> 


    class cDate { 
     private: 
     std::string day; 
     std::string month; 
     std::string year; 
     public: 
     void setDate(std::string, std::string, std::string); 
     std::string getDate(int); 
    }; // end class def 
+2

Задайте себе, что цель '#ifndef CDATE_H_EXISTS' ... –

+0

Помещение' # endif' в начале файла заголовка C++ поражает всю цель директивы препроцессора '# ifdef': чтобы избежать содержимого заголовка включается несколько раз одним и тем же исходным файлом. –

+4

Возможный дубликат [Почему #ifndef и #define используются в файлах заголовков C++] (http://stackoverflow.com/questions/1653958/why-are-ifndef-and-define-used-in-c-header-files) –

ответ

1

Вы должны исключить все содержимое файла, если он уже обработан.

Целью является не #define защитник заголовка - это полезный (иш) побочный эффект. Цель состоит в том, чтобы обеспечить заголовок содержание загружается только один раз.

+0

Ваш ответ имеет полный смысл - и не оставляет никаких вопросов. Спасибо. –

7

Первый пример, это include guard

Второй пример, это ничего-охранник.

+1

Рекомендовать цитату для этой цитаты, чтобы сохранить все кошерное. – user4581301

+0

хорошая рекомендация, теперь я просто думал, что цитата не нужна, потому что это базовая концепция. Удалите его, чтобы сделать ответ более плоским. – Nik

1

Хотя, тонкий, разница огромна. Предполагая, что вы разместили #endif сразу после вашего оператора #define, это определение будет полностью пустым, и если есть ситуация, когда ваш файл заголовка включается более одного раза, файл все равно будет скомпилирован и вызовет проблемы, поскольку ничего не было определено.

После того, как оборотная сторона, #endif является должен быть в самом конце, чтобы установить определение, как весь файл и его содержимое коды, так что, если он включен более чем один раз, никто из файла не будет выполненный в избытке.

3

Он не выполняет свою задачу; в том числе этот заголовочный файл снова будет включать все строки снова.

Рассмотрим если заявления:

if (condition) { 
    <do something> 
} 

vs.

if (condition) { 
    (void) 0; 
} 
<do something> 

условием является #ifndef (если не определено), открытие скобка является начальным условием, а закрывающая скобка одно и то #endif.

Смежные вопросы