VVWVV
08.12.2016, 23:08
В данной статье я постараюсь объяснить обход защиты от повторного включения в исходный файл. Данная статья будет полезна тем, кто пишет, или собирается написать своей многофайловый проект.
Введение
Защита от повторного включения (или file guard, include guard) – защита, позволяющая избегать проблемы с повторным включением какой-либо библиотеки в исходный файл. Данный защитник работает следующем образом: генерирует константу, в названии которой содержится имя включаемого файла, и при последующем включении файла с таким же названием, защитник просто проигнорирует его. Важно отметить, что константа содержит только название файла, а не полный путь.
Проблема и решение
Проблема данного способа заключается в том, что названия файлов из разных директорий могут совпадать, хотя вероятность этого очень мала. Важно сказать, что на разных операционных системах это может работать по-разному.
Например, в операционной системе Windows это работает так:
#include "some_dir_1\file"
#include "some_dir_2\file"
В остальных же это может работать так:
#include "some_dir_1\\\\file"
#include "some_dir_2\\\\file"
Хотя вряд ли кто-то из вас будет писать подобное.
Будет загружен лишь один файл. Это происходит из-за обратного слэша, который присутствует в данном примере. Кроме того, первая конструкция повлечёт множество ошибок, например, на других операционных системах. Советую вам использовать обычный слэш для того, чтобы избежать ошибок.
Давайте рассмотрим рабочий пример как для Windows, так и для других операционных систем.
#include "some_dir_1/file"
#include "some_dir_2/file"
Оба файла будут загружаться во всех операционных системах одинаково.
Немного советов
Для того чтобы избежать ошибок, необходимо использовать обычный слэш.
Использовать уникальные названия файлов. Кроме того, использовать теги перед этими названиями, дабы уменьшить вероятность совпадения.
Удалять генерируемую константу, используя препроцессорную директиву #undef.
В компиляторе от Zeex константа не генерируется, т.е. вышесказанной проблемы не появится. Однако, вы можете восстановить генерацию данной константы, используя флаг -Z.
Автор: VVWVV
Исключительно для pro-pawn.ru
Копирование данной статьи на других ресурсах без разрешения автора запрещено!
Введение
Защита от повторного включения (или file guard, include guard) – защита, позволяющая избегать проблемы с повторным включением какой-либо библиотеки в исходный файл. Данный защитник работает следующем образом: генерирует константу, в названии которой содержится имя включаемого файла, и при последующем включении файла с таким же названием, защитник просто проигнорирует его. Важно отметить, что константа содержит только название файла, а не полный путь.
Проблема и решение
Проблема данного способа заключается в том, что названия файлов из разных директорий могут совпадать, хотя вероятность этого очень мала. Важно сказать, что на разных операционных системах это может работать по-разному.
Например, в операционной системе Windows это работает так:
#include "some_dir_1\file"
#include "some_dir_2\file"
В остальных же это может работать так:
#include "some_dir_1\\\\file"
#include "some_dir_2\\\\file"
Хотя вряд ли кто-то из вас будет писать подобное.
Будет загружен лишь один файл. Это происходит из-за обратного слэша, который присутствует в данном примере. Кроме того, первая конструкция повлечёт множество ошибок, например, на других операционных системах. Советую вам использовать обычный слэш для того, чтобы избежать ошибок.
Давайте рассмотрим рабочий пример как для Windows, так и для других операционных систем.
#include "some_dir_1/file"
#include "some_dir_2/file"
Оба файла будут загружаться во всех операционных системах одинаково.
Немного советов
Для того чтобы избежать ошибок, необходимо использовать обычный слэш.
Использовать уникальные названия файлов. Кроме того, использовать теги перед этими названиями, дабы уменьшить вероятность совпадения.
Удалять генерируемую константу, используя препроцессорную директиву #undef.
В компиляторе от Zeex константа не генерируется, т.е. вышесказанной проблемы не появится. Однако, вы можете восстановить генерацию данной константы, используя флаг -Z.
Автор: VVWVV
Исключительно для pro-pawn.ru
Копирование данной статьи на других ресурсах без разрешения автора запрещено!