В чём отличие #pragma once от #ifndef / #define / #endif ?
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 26.06.18 09:21
Оценка: -3
Есть некоторый .h-файл MyFile.h . В нём я хочу дать указание компилятору, что он определяется только один раз.
Я могу для этого написать в этом файле как следующим образом:

#pragma once

// текст файла MyFile.h


так и следующим образом:

#ifndef MYFILE_H
#define MYFILE_H

// текст файла MyFile.h

#endif


В чём отличие этих двух способов друг от друга?
1613 г. = 2024 г.
Re: Standard
От: Qbit86 Кипр
Дата: 26.06.18 09:28
Оценка: +3
Здравствуйте, RussianFellow, Вы писали:

RF>В чём отличие этих двух способов друг от друга?


Способ «#pragma once» не стандартизован и поэтому теоретически непереносим.
Глаза у меня добрые, но рубашка — смирительная!
Re: В чём отличие #pragma once от #ifndef / #define / #endif ?
От: koenjihyakkei Россия  
Дата: 26.06.18 09:37
Оценка: 10 (2) +1 :))) :))) :))) :))) :))
Здравствуйте, RussianFellow, Вы писали:

http://rsdn.org/forum/cpp/6891389
Автор: RussianFellow
Дата: 01.09.17


Даа, товарищ, вы бы проверились у врача, а то с памятью у вас совсем плохо
Re[2]: В чём отличие #pragma once от #ifndef / #define / #endif ?
От: Muxa  
Дата: 26.06.18 09:40
Оценка: 1 (1) +3 :))
K>Даа, товарищ, вы бы проверились у врача, а то с памятью у вас совсем плохо

Начался очередной виток по циклическому буферу тем.
Кто разработчик? Пофиксите бота.
Re: В чём отличие #pragma once от #ifndef / #define / #endif ?
От: DenisCh Россия  
Дата: 30.06.18 11:08
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF> Есть некоторый .h-файл MyFile.h . В нём я хочу дать указание компилятору, что он определяется только один раз.

RF> Я могу для этого написать в этом файле как следующим образом:
RF> В чём отличие этих двух способов друг от друга?

прагма — это копмилятор-специфик.
avalon/2.0.3
Re[2]: Standard
От: galileo Земля  
Дата: 02.07.18 19:53
Оценка:
Здравствуйте, Qbit86, Вы писали:

RF>>В чём отличие этих двух способов друг от друга?


Q>Способ «#pragma once» не стандартизован и поэтому теоретически непереносим.


но в то же время поддерживается большинством современных компиляторов, что делает его переносимым практически
Re[3]: Переносимость
От: Qbit86 Кипр
Дата: 02.07.18 20:54
Оценка:
Здравствуйте, galileo, Вы писали:

G>но в то же время поддерживается большинством современных компиляторов, что делает его переносимым практически


Да.
Глаза у меня добрые, но рубашка — смирительная!
Re[3]: Standard
От: watchmaker  
Дата: 02.07.18 22:39
Оценка:
Здравствуйте, galileo, Вы писали:

G>но в то же время поддерживается большинством современных компиляторов, что делает его переносимым практически


Для переносимости мало одной поддержки компиляторами. Нужно чтобы ещё и поведение совпадало. И вот именно с этим возникают проблемы. Ну если, конечно, не стандартизировать для этой функциональности unspecified поведение :)
Отредактировано 02.07.2018 22:53 watchmaker . Предыдущая версия .
Re: В чём отличие #pragma once от #ifndef / #define / #endif ?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 02.07.18 22:43
Оценка: :))
Здравствуйте, RussianFellow, Вы писали:

RF>Есть некоторый .h-файл MyFile.h . В нём я хочу дать указание компилятору, что он определяется только один раз.

RF>Я могу для этого написать в этом файле как следующим образом:

Ну, расслабься — C++ — это не твоё. Не мучай себя
Маньяк Робокряк колесит по городу
Re[4]: Standard
От: galileo Земля  
Дата: 03.07.18 08:33
Оценка:
Здравствуйте, watchmaker, Вы писали:

G>>но в то же время поддерживается большинством современных компиляторов, что делает его переносимым практически


W>Для переносимости мало одной поддержки компиляторами. Нужно чтобы ещё и поведение совпадало. И вот именно с этим возникают проблемы. Ну если, конечно, не стандартизировать для этой функциональности unspecified поведение


даже стандарт не гарантирует полной переносимости, потому что это зависит от реализации компиляторов
но что касается #pragma once тут все довольно очевидно, уже давно пора ее в стандарт включить
Re[5]: Standard
От: Erop Россия  
Дата: 04.07.18 14:20
Оценка:
Здравствуйте, galileo, Вы писали:

G>даже стандарт не гарантирует полной переносимости, потому что это зависит от реализации компиляторов

G>но что касается #pragma once тут все довольно очевидно, уже давно пора ее в стандарт включить

Тем не менее, есть, как минимум, две разные реализации.
Одна — действует на однократность включения того хедера, в котором заявлена
Вторая — действует на однократность включения всех хедеров в той единице трансляции, в которой заявлена
Какую надо включить в стандарт?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[6]: Standard
От: galileo Земля  
Дата: 05.07.18 07:12
Оценка: +1 :)
Здравствуйте, Erop, Вы писали:

E>Тем не менее, есть, как минимум, две разные реализации.

E>Одна — действует на однократность включения того хедера, в котором заявлена
E>Вторая — действует на однократность включения всех хедеров в той единице трансляции, в которой заявлена
E>Какую надо включить в стандарт?

я не силен в реализациях компиляторов, но не вижу принципиальной проблемы, если обе реализации имеют место быть, можно стандартизировать обе
но если должен остаться только один, со своей колокольни я бы не глядя проголосовал за ту что используется в MSVC
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.