что означает директива #ifndef #define

Я новичок в C ++. Когда я создаю заголовочный файл Arme.h, я автоматически получаю эти инструкции

#ifndef DEF_ARME
#define DEF_ARME

Что это значит и важно ли это?

3

Решение

#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
7

Другие решения

#ifndef = если не определено

#define = определить

Напомним также, что:

#include = вести себя так, как будто содержимое указанного файла было скопировано и вставлено сюда

Таким образом, чистый эффект заключается в следующем:

#include "A.h"#include "A.h"

Первый делает #define а второй затем отказывается вставить вторую копию того же текста в силу #ifndef,

Обычно то, что могло бы случиться на самом деле, больше похоже на:

#include "A.h"#include "B.h"
/* but B.h says:

#include "A.h"
*/

Так что вы избегаете потенциальных ошибок двойного объявления от компилятора везде, где есть зависимости, даже немного сложнее.

3

Все, что нужно сделать для защиты заголовков, это разрешить включение заголовков только один раз. Если они включены несколько раз, они просто игнорируются.
Поэтому, определив его в верхней части заголовочного файла, вы убедитесь, что он включен в программу только один раз.

0

Эта конструкция обычно используется в заголовочных файлах. Чтобы не включать #include несколько заголовочных файлов, вы должны поместить #ifndef и #define ‘нечто’, специфичное для этого заголовочного файла. В следующий раз, когда вы попытаетесь включить тот же заголовок, ваше «что-то» будет уже определено и будет запрещено включать.

Надеюсь, поможет.

0

Вы можете настроить исходный код во время компиляции с помощью следующих макросов:

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"
[заметки]
  • с макросами можно сделать много вещей, таких как включение / выключение частей кода, если определен какой-либо токен
  • например, у вас есть игра и вы хотите отладочные рисунки во время отладки, но не в финальном приложении
  • тогда просто используйте определение … как в примере с pi.h
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector