Я новичок в C ++. Когда я создаю заголовочный файл Arme.h, я автоматически получаю эти инструкции
#ifndef DEF_ARME
#define DEF_ARME
Что это значит и важно ли это?
#ifndef
означает: «если не определено»
#define DEF_ARME
говорит само за себя: здесь определен «пустой макрос» «DEF_ARME». Мы часто видим эту конструкцию в заголовочных файлах: весь ваш заголовочный файл будет включен в эти:
#ifndef HEADER_NAME
#define HEADER_NAME
(here the code you want to include only once, as is general the case for headers)
#endif
Таким образом: при первом включении файла заголовка макрос «HEADER_NAME» еще не определен, поэтому он будет определен и код заголовка будет включен. Если вы включите этот же заголовок позже, HEADER_NAME уже будет определен, поэтому этот код не будет включен в другой раз.
ПРИМЕЧАНИЕ: директива препроцессора
#ifndef
является условием и (как и любая конструкция «если тогда»), должна быть завершена, в этом случае
#endif
#ifndef
= если не определено
#define
= определить
Напомним также, что:
#include
= вести себя так, как будто содержимое указанного файла было скопировано и вставлено сюда
Таким образом, чистый эффект заключается в следующем:
#include "A.h"#include "A.h"
Первый делает #define
а второй затем отказывается вставить вторую копию того же текста в силу #ifndef
,
Обычно то, что могло бы случиться на самом деле, больше похоже на:
#include "A.h"#include "B.h"
/* but B.h says:
#include "A.h"
*/
Так что вы избегаете потенциальных ошибок двойного объявления от компилятора везде, где есть зависимости, даже немного сложнее.
Все, что нужно сделать для защиты заголовков, это разрешить включение заголовков только один раз. Если они включены несколько раз, они просто игнорируются.
Поэтому, определив его в верхней части заголовочного файла, вы убедитесь, что он включен в программу только один раз.
Эта конструкция обычно используется в заголовочных файлах. Чтобы не включать #include несколько заголовочных файлов, вы должны поместить #ifndef и #define ‘нечто’, специфичное для этого заголовочного файла. В следующий раз, когда вы попытаетесь включить тот же заголовок, ваше «что-то» будет уже определено и будет запрещено включать.
Надеюсь, поможет.
Вы можете настроить исходный код во время компиляции с помощью следующих макросов:
1. использовать указанную версию функции
int factorial1(int n)
{
if (n<=1) return 1;
return n*factorial1(n-1);
}
int factorial2(int n)
{
int f,i;
for (f=1,i=2;i<=n;i++) f*=i;
return f;
}
#define factorial(n) factorial1(n)
//#define factorial(n) factorial2(n)
void main()
{
int i=factorial(10);
}
2. избегать множественного включения (хорошо, если у вас есть глобальные переменные)
// this will avoid text below if _pi_h is already defined ... ie pi.h is already included
#ifndef _pi_h
// this will define global token _pi_h which means that file pi.h is already included
#define _pi_h
// global viariable
double pi=3.1415926535897932384626433832795;
// end of ifndef
#endif
// now you can do this without error (very handy for nested includes...)
#include "pi.h"#include "pi.h"#include "pi.h"
[заметки]