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

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

Восстановить пароль Регистрация
 
relationer
33 / 0 / 0
Регистрация: 07.11.2013
Сообщений: 118
27.05.2014, 21:31     Корректность использования #ifdef для предотвращения компиляции #1
Здравствуйте!

Есть шаблон 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) не создает.
Однако, возможно, это только его особенность. Что происходит на других компиляторах и корректен ли такой лайфхак вообще?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.05.2014, 21:31     Корректность использования #ifdef для предотвращения компиляции
Посмотрите здесь:

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

Под корректностью тут я понимаю не правильность кода и не собственно, сработает ли, а вообще корректно ли так писать с точки зрения человека - программиста. Что называется, компилятору с высокой колокольни на то, как названы переменные, если они называны по стандарту, но ведь никакой нормальный программист не станет называть класс именами типа Lol, Mashinka, Это_класс, MenejerPolizovatelja, LOL_THIS_IS_YET_ANOTHER_USELESS_NAMING_LOL - поскольку к нему вряд ли будут после этого хорошо относиться.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
27.05.2014, 22:14     Корректность использования #ifdef для предотвращения компиляции #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от relationer Посмотреть сообщение
А когда компилятор доберется до этого самого несамостоятельного cpp-файла, то условие не сработает, и компилятор не скажет что-нибудь вроде "What is Vector?".
так вот тут и встает вопрос: почему компилятор доберется до этого файла?
Цитата Сообщение от relationer Посмотреть сообщение
Компилятор для каждого cpp-файла вызывается отдельно
не надо вызывать компилятор для этого файла
Yandex
Объявления
27.05.2014, 22:14     Корректность использования #ifdef для предотвращения компиляции
Ответ Создать тему
Опции темы

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