LINUX.ORG.RU

[Qt] #ifndef #define - зачем?

 


0

2

Во многих Qt приложениях в заголовочных файлах встречаю что-то вроде

#ifndef DOWNLOADINFOFILTER_H
#define DOWNLOADINFOFILTER_H
<...>
#endif
Сам так никогда не делал, ибо понятия не имею для чего нужен сей магический ритуал. Объясните, если не трудно.

Это есть в любых заголовочных файлах С/С++, это делается, чтобы избежать множественного включения одного файла.

hippi90 ★★★★★
()

file1.c:
#include <file2.h>
#include <file3.h>

file2.h:
#include <file3.h>

в file1.c file3.h инклюдится 2 раза -> получаем тонну мессаг о повторном определении функций

marvin_yorke ★★★
()

к Qt это кстати не имеет никакого отношения, это стандартная практика С/С++. еще некоторые компиляторы умеют #pragma once для тех же целей

marvin_yorke ★★★
()

> Во многих Qt приложениях в заголовочных файлах встречаю что-то вроде

> Во многих Qt приложениях

у меня для тебя плохие новости :)

find /usr/include/linux/ -name '*.h' -exec sh -c 'echo "{}"; grep "^#" "{}" | head -2' \;

http://en.wikipedia.org/wiki/Include_guard

arsi ★★★★★
()
Ответ на: комментарий от arsi

Ты может быть сейчас еще скажешь, что есть линупсы, кроме убунты?

anonymous
()

Настоятельно советую досконально выучить С++ перед тем, как лезть в Qt. Потому что, судя по вопросу, ты С++ вообще не знаешь.

Pavval ★★★★★
()
Ответ на: комментарий от mono

Зачем сарказм? Большинство компиляторов(в том числе gcc), поддерживают эту директиву, хоть она и не входит в стандарт, так что можно ее использовать.

netcat ★★
()
Ответ на: комментарий от Pavval

досконально выучить С++

невозможно =)
Но книжки обязательно почитаю, после того как си и эрланг осилю.

Dragon59 ★★
() автор топика
Ответ на: комментарий от netcat

Следовать стандарту - это все-таки хорошо, этим ты получаешь хоть какую-то гарантию, что все заработает везде. Да и писать ifndef - define не сильно сложнее, чем pragma once.

А вот рекламировать фичи, которых нет в стндарте, - это плохо.

И да, решение с import мне нравится намного больше, и тоже поддерживается gcc :)

mono ★★★★★
()

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

Deleted
()
Ответ на: комментарий от netcat

На однлом форуме видел совет делать так:

#pragma once

#ifndef __SOMEHEADER_H_INCLUDED__
#define __SOMEHEADER_H_INCLUDED__

//здесь код

#endif
Зачем? А затем, что #pragma once считается более быстрым, и если компилятор его умеет, то дальше парсить файл он не должен.

Сам обычно делаю обычный include_guard без никаких прагм.

Deleted
()
Ответ на: комментарий от Deleted

Сам обычно делаю обычный include_guard без никаких прагм.

Ну и правильно. А насчёт того, что «#pragma once считается более быстрым», есть у меня сомнения. При современных-то компиляторных технологиях...

DeVliegendeHollander ★★
()

Сколько тебе лет, мальчик? Какого хера ты взялся за Qt если С++ в глаза ни разу не видел?

anonymous
()
Ответ на: комментарий от netcat

имеется в виде, что такие вещи будут разрешаться без вызова препроцессора, за счет чего и получается прирост в скорости.

mono ★★★★★
()
Ответ на: комментарий от mono

имеется в виде, что такие вещи будут разрешаться без вызова препроцессора

Вон даже как. Не знал. Век живи - век учись.

DeVliegendeHollander ★★
()
Ответ на: комментарий от netcat

Это понятно. Просто я «прицепился» к тому, что препроцессор, в том или ином виде, входит в состав компилятора. То есть, include-gard, вообще говоря, задача компилятора, а в частности - задача препроцессора. Ну, цепляюсь я, как репей, не обращай особого внимания. :)

DeVliegendeHollander ★★
()
Ответ на: комментарий от Deleted

franchukroman

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

Все современные компиляторы распознают include guard'ы и при повторном #include даже не открывают файл. Раньше это было почти единственным преимуществом #pragma once. Так что ненужно.

Pavval ★★★★★
()
Ответ на: комментарий от Dragon59

досконально выучить С++

невозможно =)

Не смеши мои тапочки. include guards - это азы программирования на C и C++. Если ты не знаешь азов - никаких Qt. Учи язык, а то я от таких быдлокодеров на собеседованиях окончательно разобью себе лицо facepalm'ом.

Pavval ★★★★★
()
Ответ на: комментарий от netcat

> Большинство компиляторов(в том числе gcc), поддерживают эту директиву, хоть она и не входит в стандарт, так что можно ее использовать.

Error: Multiple declaration 

© suncc-12.1

remark #1782: #pragma once is obsolete. Use #ifndef guard instead.

© icc-11.1

;)

arsi ★★★★★
()
Ответ на: комментарий от Dragon59

досконально выучить С++

мне лень =)

Пофиксил во имя правды. Невозможно построить треугольник со сторонами 1, 2, 5. А изучить язык программирования - вполне посильная задача.

Тем более, что include_guard - это азы, без них кикуда.

Deleted
()
Ответ на: комментарий от Deleted

Пофиксил во имя правды. Невозможно построить треугольник со сторонами 1, 2, 5. А изучить язык программирования - вполне посильная задача.


Я же написал, что сейчас занят изучением другого ЯП.

include_guard - это азы, без них никуда.


Не спорю, просто ни разу ещё не встречался. У меня, в основном, архитектура простая и на двойное включение ни разу не натыкался.

Dragon59 ★★
() автор топика
Ответ на: комментарий от Deleted

Зачем? А затем, что #pragma once считается более быстрым, и если компилятор его умеет, то дальше парсить файл он не должен.

Потому что так правильно с точки зрения стандарта. Ибо код с pragma должен работать также, как и без. То есть если #pragma once поддерживается, то она будет использоваться. Иначе она будет игнорироваться, и в дело вступает include guard.

alex_custov ★★★★★
()
Ответ на: комментарий от Deleted

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

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

m0rph ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.