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

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

Войти
Регистрация
Восстановить пароль
 
relationer
33 / 0 / 0
Регистрация: 07.11.2013
Сообщений: 118
#1

Корректность использования #ifdef для предотвращения компиляции - C++

27.05.2014, 21:31. Просмотров 297. Ответов 3
Метки нет (Все метки)

Здравствуйте!

Есть шаблон Vector.

Он определен в файле vector.hpp. Для выноса кода шаблона в отдельный файл я использовал метод включения cpp-файла в hpp-файл.
Т. е.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// vector.hpp
#ifndef VECTOR_HPP
#define VECTOR_HPP
template<typename T>
class Vector
{
    //...
}
#include "vector.cpp"
#endif
// end of vector.hpp
// vector.cpp
template<typename T>
Vector<T>::something() { }
//...
// end of vector.cpp
Однако очевидно, что подобный cpp-файл нельзя компилировать.
Вопрос. Корректно ли использовать следующую конструкцию в cpp-файле:
C++
1
2
3
#ifdef VECTOR_HPP
// ...
#endif
Дополнительных object-файлов для подобных cpp мой компилятор (g++ 4.8.2) не создает.
Однако, возможно, это только его особенность. Что происходит на других компиляторах и корректен ли такой лайфхак вообще?
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.05.2014, 21:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Корректность использования #ifdef для предотвращения компиляции (C++):

Исправить ошибку компиляции "для использования класса шаблон требуется список аргументов шаблона" - C++
Решил создать класс List для задания двусвязного списка, и в самом начале компилятор начал ругаться на шаблон класса: error C2955:...

Программа для предотвращения запуска определенных процессов во время работы приложения - C++
Доброго времени суток. Я мало знаком с программированием в целом, и мне нужна помощь, может какие конкретные инструкции. Если точнее, то...

Ошибка при компиляции:"C2955 "Tree": для использования класс шаблон требуется список аргументов шаблон" - C++
Есть класс бинарного дерева, в нем структура. Класс - Tree, структура - list(листик, а не список). При компиляции выдает...

ifdef и Ко, указатели в фунциях - C++
1.как используются ifdef и endif 2. как реализоввать, ну например, такое: int myFunc(int *one, int *two, int *three) куда описание...

Избавляемся от #ifdef DEBUG - C++
Доброго времени суток. В своем проекте для отладки использую: #define DEBUG ... ... ... #ifdef DEBUG std::cout &lt;&lt; index...

Директива #ifdef _DEBUG - C++
Добрый день, возникла следующая проблема: при переключении конфигурации Debug / Release директива #ifdef _DEBUG перестала реагировать на...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
27.05.2014, 21:52 #2
Цитата Сообщение от relationer Посмотреть сообщение
Однако очевидно, что подобный cpp-файл нельзя компилировать.
Вопрос. Корректно ли использовать следующую конструкцию в cpp-файле:
корректно, но зачем? чтобы избежать компиляции? так это не поможет
0
relationer
33 / 0 / 0
Регистрация: 07.11.2013
Сообщений: 118
27.05.2014, 22:03  [ТС] #3
корректно, но зачем? чтобы избежать компиляции? так это не поможет
Почему же? Поможет. Компилятор для каждого cpp-файла вызывается отдельно, в случае, если cpp-файл был включен через hpp, то препроцессорное условие в cpp срабатывает, и код компилируется. А когда компилятор доберется до этого самого несамостоятельного cpp-файла, то условие не сработает, и компилятор не скажет что-нибудь вроде "What is Vector?".

Под корректностью тут я понимаю не правильность кода и не собственно, сработает ли, а вообще корректно ли так писать с точки зрения человека - программиста. Что называется, компилятору с высокой колокольни на то, как названы переменные, если они называны по стандарту, но ведь никакой нормальный программист не станет называть класс именами типа Lol, Mashinka, Это_класс, MenejerPolizovatelja, LOL_THIS_IS_YET_ANOTHER_USELESS_NAMING_LOL - поскольку к нему вряд ли будут после этого хорошо относиться.
0
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
27.05.2014, 22:14 #4
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от relationer Посмотреть сообщение
А когда компилятор доберется до этого самого несамостоятельного cpp-файла, то условие не сработает, и компилятор не скажет что-нибудь вроде "What is Vector?".
так вот тут и встает вопрос: почему компилятор доберется до этого файла?
Цитата Сообщение от relationer Посмотреть сообщение
Компилятор для каждого cpp-файла вызывается отдельно
не надо вызывать компилятор для этого файла
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.05.2014, 22:14
Привет! Вот еще темы с ответами:

Что такое __SC__ в #ifdef? - C++
В одном из исходников есть такой код #ifdef __SC__ typedef long long LONGLONG; #else typedef __int64 LONGLONG; #endifИ такой (часть...

Команды #ifndef #ifdef и #endif - C++
Помогите разобраться с командами #ifndef #endif и #ifndef в книге все как то не понятно объяснено или же лучше если у кого то есть видео на...

#ifdef _WIN32 что это? - C++
возник вопрос с кодом.с си и с++ не знаком.пожалуйста объясните что тут происходит? #ifdef _WIN32 #include &lt;windows.h&gt; ...

функция для проверки ip адресса на корректность - C++
всем привет. Я тут новенький и вообще новачок в программировании. Не могли бы вы мне помочь с программой? я хочу написать программу...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
27.05.2014, 22:14
Ответ Создать тему
Опции темы

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