Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 5.00
thick_int
Заблокирован
#1

#pragma once - C++

25.11.2011, 17:46. Просмотров 2392. Ответов 17
Метки нет (Все метки)

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

#pragma once - C++
Здравствуйте. Есть три файла (для удобства забудем о двух других .cpp): Main.cpp Head1.h Head2.h //Main.cpp #include...

#pragma once - C++
Здравствуйте #pragma once Куда его лучше вставлять ? В файл самого класс(например, сf.h) или в реализацию его функций (cf.cpp)?

Препроцессор #pragma - C++
Как я понимаю, препроцессор #pragma используется, в частности, для выравнивания полей в структурах. Например, в заголовочном файле перед...

Использование #pragma once - C++
Доброго времени суток, форумчане! Проблема следующего характера: Есть среда разработки Visual Studio Community 2017 Версия 15.0.26228.4...

Форумчане разъясните #pragma once) - C++
#pragma once и #ifndef Variables_h_ #define Variables_h_ .... #endif это что одно и тоже? первый вариант свежий а второй...

Директива препроцессора pragma - C++
Добрый день! Помогите, пожалуйста, не могу понять смысл такой записи. (интересуют строки с участием _PACKED(строки 2-6 и 51-60), и что...

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

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

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

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

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

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

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

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

Добавлено через 59 секунд
Цитата Сообщение от thick_int Посмотреть сообщение
int const MaxStackSize(50);
завуалированное int const MaxStackSize = 50;
смело!
1
thick_int
Заблокирован
25.11.2011, 18:30  [ТС] #8
Ну значит я так понял, пока можно пользоваться прагмой, а далее разберусь.
0
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
25.11.2011, 18:51 #9
thick_int, приведите полный пример
и программа не компилируется, или просто vs чтото там подсвечивает?
если последнее - то нестрашно, тамошний парсер недалекого ума
0
thick_int
Заблокирован
25.11.2011, 19:28  [ТС] #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
0
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
25.11.2011, 19:54 #11
Цитата Сообщение от thick_int Посмотреть сообщение
int const MaxStackSize(50); //двух директив (если так, то typedef, а если переставить, то int)
Глобальная переменная - это плохо.
0
thick_int
Заблокирован
25.11.2011, 20:08  [ТС] #12
А в чем страх то, это же константа всего лишь.

Верно, что глобальная переменная - это не очень хорошо, но глобальная константа - вещь вполне приемлемая.
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
25.11.2011, 20:32 #13
thick_int, Обычно для такого делают анонимный namespace,
0
Сыроежка
Заблокирован
25.11.2011, 20:44 #14
Цитата Сообщение от ForEveR Посмотреть сообщение
thick_int, Обычно для такого делают анонимный namespace,
Константы имеют внутреннее связывание, поэтому не имеет большого смысла помещать ее в анонимное пространство имен. Ее и так никто не видет за пределами единицы трансляции.
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
25.11.2011, 20:58 #15
Сыроежка, Да. Но все же формально она становится не глобальной константой (формально с точки зрения человека, а не компилятора).
0
25.11.2011, 20:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.11.2011, 20:58
Привет! Вот еще темы с ответами:

Не работает #pragma comment - C++
Пишу так #pragma comment(lib,libgdi32.a) но библиотека не включается. Почему?

О #pragma warning(disable: 4786) - C++
Вот создаю пустое приложение Win32 Console Application. Добавляю к примеру файл ex.cpp со следующим содержанием: #include <string> ...

Почему не работает #pragma omp task? - C++
Сижу быструю сортировку распараллеливаю. Использую подручные средства, а именно Visual Studio 2013 Ultimate. Программа никак не хочет...

Что такое stract pragma и union - C++
Учусь писать программки для микроконтроллеров, и в большинстве примеров используют эти штучки, пробовал гуглить, но до конца их сути так и...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru