C ++ Включить охрану для стандартных заголовков

Мне интересно, если / что включает в себя охранники на такие файлы, как windows.h, math.h, iostream, stdio… так далее.

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

Мне просто интересно, каковы стандарты для такого рода вещей.

5

Решение

Чувак, вы невероятно ленивы, просто откройте файл (вы можете даже щелкнуть правой кнопкой мыши на директиве include в большинстве редакторов), и он начинается с чего-то вроде:

#ifndef _WINDOWS_
#define _WINDOWS_
...

Так что в первый раз он пойдет в файл с _WINDOWS_ не определен, поэтому он будет определен и содержимое файла будет включено. Второй раз #ifndef потерпит неудачу, так как определение было сделано ранее.

Это стандартный способ поставить защиту, другой способ, который поддерживается многими компиляторами, это поставить #pragma once, Это дает преимущество в предотвращении столкновений в случае, если кто-то определит эту же константу, например, в другом файле.

9

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

Стандарт C ++ требует, чтобы заголовки были организованы таким образом, чтобы вы могли включать любой из них несколько раз, прямо или косвенно, без проблем. Он не предписывает, как будет достигнут этот результат, просто он должен быть достигнут.

ISO / IEC 14822: 2011

17.6.2.2 Заголовки [using.headers]

Unit2 Единица перевода может включать заголовки библиотеки в любом порядке (пункт 2). Каждый может быть включен более одного раза, без эффекта, отличного от того, чтобы быть включенным ровно один раз, за ​​исключением того, что эффект включения либо <cassert> или же <assert.h> зависит каждый раз от лексически текущего определения NDEBUG,178

178 Это то же самое, что и библиотека Standard C.

10

Поддержка многих компиляторов #pragma once, Все стандартные библиотеки уже имеют охранников в виде #pragma once или соответствующие макросы препроцессора. Вы можете узнать больше о том, как выглядят охранники на страница Википедии. Самый быстрый способ убедиться в этом — щелкнуть правой кнопкой мыши определение включаемого файла и попросить среду разработки (Visual Studio / Eclipse) открыть файл. Тогда вы увидите охранников.

3

Эти файлы расположены в /usr/include/ и подкаталоги (по крайней мере, на моем ноутбуке Debian). Смотря на /usr/include/stdio.h

показывает типичный охранник,

#ifndef _STDIO_H
# define _STDIO_H       1

И проверка на cpp, grep __cplusplus,

#if !defined __cplusplus || defined __STDC_LIMIT_MACROS

1
По вопросам рекламы [email protected]