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

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

Войти
Регистрация
Восстановить пароль
 
nefton
44 / 20 / 5
Регистрация: 28.02.2013
Сообщений: 189
#1

конструкция #if not defined "xxx" #define xxx нужна ли? - C++

06.03.2013, 12:03. Просмотров 933. Ответов 10
Метки нет (Все метки)

Решил вот научится писать не просто код, а правильный код.
часто в заголовочных файлах вижу конструкцию
C++
1
2
3
4
#if !defined(_xxx)
#define _xxx
//some code
#endif
Нужно ли это?

Добавлено через 1 минуту
п.с. подразумевается что и я и кто будет использовать эти файлы должны всё делать правильно
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.03.2013, 12:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос конструкция #if not defined "xxx" #define xxx нужна ли? (C++):

Обработка телефонного номера в форме (XXX)XXX-XX-XX - C++
Напишите программу, которая вводит телефонный номер в форме (XXX)XXX-XX-XX. Программа должна извлекать в виде лексем код места...

"XXX.exe не является приложением win32" - перенос проекта на XP - C++
Привет всем! Возникла проблема.. написал прогу на плюсах, скомпилил - работает(VS 2012). Решил проверить работу на XP и нифига не...

Как открыть файл "xxx.mdb" технологией DAO - C++
Файлы в формате Access'97 открываются легко, а при попытке открыть аналогичный файл формата Access'2000 выдается сообщение 'Неопознанный...

Добавить "xxx" перед последним словом строки - C++
#include <iostream> #include <stdio.h> #include <string.h> int main(void) { char s; char sr; printf("BBeduTe...

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно" - C++
В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно". Я так...

Переопределение формального параметра XXX - C++
Код #include <jni.h> #include <windows.h> typedef jint(JNICALL *JNI_CREATEJAVAVM)(JavaVM **, JNIEnv **, void *); JNI_CREATEJAVAVM...

10
Байт
Эксперт C
16535 / 10805 / 1638
Регистрация: 24.12.2010
Сообщений: 20,827
06.03.2013, 12:08 #2
Цитата Сообщение от nefton Посмотреть сообщение
Нужно ли это?
Непременно! Это делается для гарантии того, что код из хедера не будет вставлен дважды и на этой почве не произойдет зацикливания препроцессора.
Вместо _xxx обычно используется ИМЯ_H, где ИМЯ - имя соответствующего хедера
1
ITcrusader
Эксперт С++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
06.03.2013, 12:13 #3
Ага. Наиболее классический вариант использования такой:
C++
1
2
3
4
5
#pragma once // студийная мулька. Тоже не повредит здесь
#ifndef FILE_H
#define FILE_H
 // code
#endif  /* FILE_H */
2
Jupiter
06.03.2013, 13:06
  #4

Не по теме:

Цитата Сообщение от ITcrusader Посмотреть сообщение
// студийная мулька. Тоже не повредит здесь
зарплата зависит от количества строк?

5
diagon
Higher
1930 / 1196 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
06.03.2013, 13:25 #5
Цитата Сообщение от ITcrusader Посмотреть сообщение
студийная мулька
Не только студийная. Ее поддерживают все адекватные компиляторы, поэтому ее можно спокойно использовать.
Недостаток инклуд гардов заключается в том, что если переименовать файл или перенести его в другое место, то дефайны тоже придется менять.
Так что, на мой взгляд, лучше использовать
C++
1
#pragma once
0
ITcrusader
Эксперт С++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
06.03.2013, 14:24 #6
Jupiter, у этих ребят, полагаю, нет.

// complex standard header
#pragma once
#ifndef _COMPLEX_
#define _COMPLEX_
...

Однажды я пытался найти ответ на вопрос "а что использовать?" В итоге, пришел к выводу, что такой способ носит более универсальный характер. Нигде ответов однозначных, декларирующих нецелесообразность использования чего-либо - я не обнаружил.
0
Jupiter
06.03.2013, 14:38
  #7

Не по теме:

Цитата Сообщение от ITcrusader Посмотреть сообщение
Однажды я пытался найти ответ на вопрос "а что использовать?" В итоге, пришел к выводу, что такой способ носит более универсальный характер. Нигде ответов однозначных, декларирующих нецелесообразность использования чего-либо - я не обнаружил.
лол что?
использовать эти две конструкции вместе все равно что
C++
1
++i; //увеличиваем переменную i на еденицу
писать такие комментарии, или вы по видеоурокам обучались и повторяете все как на каком-то видео?

1
SatanaXIII
Супер-модератор
Эксперт С++
5618 / 2653 / 246
Регистрация: 01.11.2011
Сообщений: 6,549
Завершенные тесты: 1
06.03.2013, 14:38 #8
Цитата Сообщение от ITcrusader Посмотреть сообщение
студийная мулька.
Не только. В борланде тоже есть.

nefton, вот настоятельно советую подробно почитать. Очень хорошо подытожено.

Не по теме:

Ну кроме именованных констант.

0
ITcrusader
Эксперт С++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
06.03.2013, 15:29 #9
Цитата Сообщение от Jupiter Посмотреть сообщение
зарплата зависит от количества строк?
Цитата Сообщение от Jupiter Посмотреть сообщение
или вы по видеоурокам обучались и повторяете все как на каком-то видео?
Я как-то в одной из последних тем выражал свое отношение к видео урокам: "Они годны лишь для тех, кто учится завязывать галстук". Что касается того, что вы (с высоты вашей репутации) строите предположение о том, как я обучался, на основе того, как я пользуюсь include guards'ами, то тут, мне думается, что едва ли такой способ их использования - показатель некомпетентности.

Ну, зато ваши насмешки уже получили пару положительных отзывов. Я, признаться, даже и не знаю более, что написать.
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
06.03.2013, 15:54 #10
ITcrusader, Он прав потому что. Не нужно писать лишних строк, которые не играют ровным счетом никакой роли.
0
silent_1991
Эксперт С++
4986 / 3043 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
11.03.2013, 13:30 #11
Цитата Сообщение от ITcrusader Посмотреть сообщение
В итоге, пришел к выводу, что такой способ носит более универсальный характер
В то, что #pragma once может не быть в каком-либо компиляторе, я могу поверить, ибо этого нет в стандарте. Но вот то, чтобы где-то не работали include guard'ы - такого быть не может, ибо это не специализированный механизм, а своего рода хак препроцессора, т.е. использование возможностей (описанного в стандарте) препроцессора таким вот особым образом. На фоне этого #pragma once рядом с include guard'ом выглядит как пятая нога у собаки.
0
11.03.2013, 13:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.03.2013, 13:30
Привет! Вот еще темы с ответами:

ошибка stray '\xxx' in program - C++
Не пойму что за ошибка! Ввел обычное перечисление, и всплыла эта непонятная ошибка. Если закомментировать enum, то всё впорядке. Что это...

Что означает конструкция "!!" и "!!!"? - C++
Здравствуйте! Подскажите пожалуйста, как такое понимать ? #if !(!!CONFIG) и #if (!!CONFIG)

Ошибка "first defined here" Code::Blocks - C++
Помогите решить ошибки при компиляции Код: main.cpp #include <iostream> #include <string> #include...

Как отслеживать ошибки "already defined in ." - C++
Всем привет. Компилятор ругается что xxx.obj already defined in ... . Где то я что то включил 2 раза или где то рекурсивное включение...


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

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

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