Форум программистов, компьютерный форум CyberForum.ru

#pragma once - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 5.00
thick_int
Заблокирован
25.11.2011, 17:46     #pragma once #1
Можно ли считать директиву
C++
1
#pragma once
полноценно заменой техники
C++
1
2
3
4
#ifndef MYFILE_H
#define MYFILE_H
...
#end if
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.11.2011, 17:46     #pragma once
Посмотрите здесь:

Не работает #pragma comment C++
#pragma once C++
C++ О #pragma warning(disable: 4786)
#pragma Visual C++
Форумчане разъясните #pragma once) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Сыроежка
Заблокирован
25.11.2011, 17:49     #pragma once #2
Цитата Сообщение от thick_int Посмотреть сообщение
Можно ли считать директиву
C++
1
#pragma once
полноценно заменой техники
C++
1
2
3
4
#ifndef MYFILE_H
#define MYFILE_H
...
#end if
Нет, нельзя, так как это не стандартная директива.
thick_int
Заблокирован
25.11.2011, 17:52  [ТС]     #pragma once #3
А что значит нестандартная, если речь идет только об одном компиляторе?
А именно о VS2010.

А что можете сказать относительно поведения в том и в другом случае.

Грубо говоря, вопрос ставится так.
Вот я новичок и пока хочу сосредоточиться на изучении основных свойств языка, а не копилятора.
Могу я, чтобы этого избежать просто ставить эту директиву во всех заголовках, ну пока на первых порах.
Сыроежка
Заблокирован
25.11.2011, 18:01     #pragma once #4
Цитата Сообщение от thick_int Посмотреть сообщение
А что значит нестандартная, если речь идет только об одном компиляторе?
А именно о VS2010.

А что можете сказать относительно поведения в том и в другом случае.

Грубо говоря, вопрос ставится так.
Вот я новичок и пока хочу сосредоточиться на изучении основных свойств языка, а не копилятора.
Могу я, чтобы этого избежать просто ставить эту директиву во всех заголовках, ну пока на первых порах.
То и означает, что нестандартный, то есть ваш код становится непереносимым и не будет компилироваться другими компиляторами при обнаружении дублирования объявлений.
Как раз если вы хотите изучить сам язык, а язык - это то, что написано о нем в стандарте, то надо пользоваться стандартными средствами языка.
Что касается компиляторов MS VC. то они имеют много багов. Поэтому надо ориентироваться не на конкретный компилятор, а на знание самого языка С++, чтобы уверенно говорить, что некоторая заданная конструкция корректная, а именно компилятор содержит баг.
Bers
Заблокирован
25.11.2011, 18:05     #pragma once #5
Цитата Сообщение от thick_int Посмотреть сообщение
Вот я новичок и пока хочу сосредоточиться на изучении основных свойств языка, а не копилятора.
Хочешь сосредоточится на языке - пиши по стандарту.

А так вообще, тебе в любом случае придётся столкнуться с обеими формами записи (например, в чужом коде). Они не должны сбивать с толку.
thick_int
Заблокирован
25.11.2011, 18:10  [ТС]     #pragma once #6
Цитата Сообщение от Сыроежка Посмотреть сообщение
То и означает, что нестандартный, то есть ваш код становится непереносимым и не будет компилироваться другими компиляторами при обнаружении дублирования объявлений.
Да поймите Вы, мне бы пока с основами освоиться, а не вникать в переносимость и в другие высокие материи.
Поэтому пока я естественно ориентируюсь на один единственный компилятор и на то, что данная директива будет вести себя точно таким же образзом, как и стандартная стажнаяя схема. И вот, разумеется я и расчитываю узнать, вправе ли я ожидать аналогичного поведения этих двух схем.

Между прочим, не знаю как другие, но VS2010 упорно подчеркивает красной линией вот такие заключенные между ними объявления, когда я пользуюсь стандартной схемой (хотя все компилируется нормально):

C++
1
2
typedef int DataType;
int const MaxStackSize(50);
Если же я пользуюсь прагмой, то никаких подчеркиваний нет.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
25.11.2011, 18:17     #pragma once #7
на самом деле #pragma once есть во всех топовых компиляторах
и конечно плохо, что ее нет в стандарте

Добавлено через 59 секунд
Цитата Сообщение от thick_int Посмотреть сообщение
int const MaxStackSize(50);
завуалированное int const MaxStackSize = 50;
смело!
thick_int
Заблокирован
25.11.2011, 18:30  [ТС]     #pragma once #8
Ну значит я так понял, пока можно пользоваться прагмой, а далее разберусь.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
25.11.2011, 18:51     #pragma once #9
thick_int, приведите полный пример
и программа не компилируется, или просто vs чтото там подсвечивает?
если последнее - то нестрашно, тамошний парсер недалекого ума
thick_int
Заблокирован
25.11.2011, 19:28  [ТС]     #pragma once #10
Пример простой учебный:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#pragma once
 
//#ifndef GSTACK_H
//#define GSTACK_H
 
typedef int DataType; //Все компилируется, но подсвечивается красным любое первое из этих
int const MaxStackSize(50); //двух директив (если так, то typedef, а если переставить, то int)
 
class GStack
{
public:
    GStack();
    void push(const DataType& item);
    DataType pop();
    void clear();
 
    DataType peek() const;
 
    bool isEmpty() const;
    bool isFull() const;
 
private:
    DataType StackList[MaxStackSize];
    int top;
};
 
 
 
//#endif
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
25.11.2011, 19:54     #pragma once #11
Цитата Сообщение от thick_int Посмотреть сообщение
int const MaxStackSize(50); //двух директив (если так, то typedef, а если переставить, то int)
Глобальная переменная - это плохо.
thick_int
Заблокирован
25.11.2011, 20:08  [ТС]     #pragma once #12
А в чем страх то, это же константа всего лишь.

Верно, что глобальная переменная - это не очень хорошо, но глобальная константа - вещь вполне приемлемая.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
25.11.2011, 20:32     #pragma once #13
thick_int, Обычно для такого делают анонимный namespace,
Сыроежка
Заблокирован
25.11.2011, 20:44     #pragma once #14
Цитата Сообщение от ForEveR Посмотреть сообщение
thick_int, Обычно для такого делают анонимный namespace,
Константы имеют внутреннее связывание, поэтому не имеет большого смысла помещать ее в анонимное пространство имен. Ее и так никто не видет за пределами единицы трансляции.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
25.11.2011, 20:58     #pragma once #15
Сыроежка, Да. Но все же формально она становится не глобальной константой (формально с точки зрения человека, а не компилятора).
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
25.11.2011, 21:05     #pragma once #16
Цитата Сообщение от ForEveR Посмотреть сообщение
thick_int, Обычно для такого делают анонимный namespace,
зачем такие приключения?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
25.11.2011, 21:07     #pragma once #17
alex_x_x, Возможно насчет обычно я погорячился. Как по мне - это выглядит эстетичнее.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.11.2011, 21:08     #pragma once
Еще ссылки по теме:

Visual C++ Pragma comment()
C++ Директива препроцессора pragma
#pragma once C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Сыроежка
Заблокирован
25.11.2011, 21:08     #pragma once #18
Цитата Сообщение от ForEveR Посмотреть сообщение
Сыроежка, Да. Но все же формально она становится не глобальной константой (формально с точки зрения человека, а не компилятора).
Я совершенно не понял вашего ответа. То, с одной стороны, вы хотите ее поместить в анонимное пространство имен, чтобы только одна единица трансляции с ней работала, то вы говорите про какую то глобальность. Мне представляется, что вы сами себе противоречите.
Yandex
Объявления
25.11.2011, 21:08     #pragma once
Ответ Создать тему
Опции темы

Текущее время: 02:10. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru