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

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

Войти
Регистрация
Восстановить пароль
 
nill
10 / 10 / 0
Регистрация: 16.08.2009
Сообщений: 417
#1

Как можно функцию описаную в одном файле включить во все файлы проекта - C++

17.06.2013, 18:23. Просмотров 702. Ответов 11
Метки нет (Все метки)

Задача такая
Определяю функцию в файле 1.сpp

C++
1
2
3
void test(){
int i=0;
}
как мне подключить этот файл ко всем файлам проекта чтобы исключить ошибку многократного включения этой функции
пробовал по всякому игаться с #pragma once но не помогает

Опишите плз схему, цель чтобы функция была в одном .cpp или .h файле и делая инклуд этого файла функция сразу была доступна.

Сейчас чтобы функция была доступна во всех файлах проекта я делаю описание функции в .cpp файле и описываю прототип функции в .h файле после чего включаю инклудом этот файл, после чего функция становиться доступна, хочу это все упростить и делать все в одном файле
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.06.2013, 18:23
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как можно функцию описаную в одном файле включить во все файлы проекта (C++):

Как можно объединить эти файлы? Что бы было в одном файле - PHP БД
<form action="testreg.php" method="post"> <p> <label>Ваш логин:<br></label> <input name="login" type="text" size="15" maxlength="15">...

Как присоединить к h файлу проекта и к cpp проекта файлы из папки, лежащей с ними на одном уровне - C++ Builder
Добрый день, такая задача, Пользуюсь RAD 2010 Хочу в папке проекта создать папку lib/ и в неё поместить 2 файла: 1-й даже не...

Текстовые файлы: Собрать все страницы по порядку в одном файле - Turbo Pascal
Даны файлы, созданные в текстовом редакторе Блокнот. В файле 1 записаны нечётные страницы книги, в файле2- чётные страницы. Собрать все...

Окно, разделенное сплитом на 3 части. Как распределить код, чтобы он не находился в одном файле проекта - C#
У меня в программе главное окно, разделенное сплитом на 3 части, где дерево, список, tab control, кроме того, ещё меню, панель...

Завязывания проекта на одном файле - PHP
Привет! Как завязать проект на одном файле (myIndex.php) . То есть в корневом каталоге fold есть файл myIndex.php, и другие папки,в...

Код макроса работает лишь в одном файле, как его использовать в другие файлы - VBA
Здравствуйте. Код работает лишь в одном файле, пробовал разные варианты импортировать, сохранять как надстройку не получается, выходит...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MastAKK
145 / 136 / 12
Регистрация: 13.10.2012
Сообщений: 587
17.06.2013, 18:37 #2
Нужно создать пространство имен с методом test и чтобы были инклуд гварды. Вот пример:

C++
1
2
3
4
5
6
7
8
9
10
11
12
//test.h
#ifndef TEST_H
#define TEST_H
 
#include <iostream>
 
namespace Test{
    void test() {
        std::cout << "OK!";
    }
}
#endif
C++
1
2
3
4
5
6
//main.cpp
#include "test.h"
 
int main(){
     Test::test();
}
Добавлено через 4 минуты
а ещё можно сделать так:
C++ (Qt)
1
2
3
4
5
6
7
#include "test.h"
 
using namespace Test;
 
int main(){
     test();
}
0
nill
10 / 10 / 0
Регистрация: 16.08.2009
Сообщений: 417
17.06.2013, 20:16  [ТС] #3
MastAKK,
использую Visual Studio 2010

Добавлено через 1 час 26 минут
Пример скомпилил но

проблема когда делаю инклуд test.h в другой .h файл скажем (stdafx.h)
И подключаю этот stdafx.h в .сpp файл то выдает ошибку

test.obj : error LNK2005: "void __cdecl Test::test(void)" (?test@Test@@YAXXZ) уже определен в stdafx.obj

а это очень не удобно, хотелось бы собрать все .h файлы с функциями в одном главном хедер файле и включать только его
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
17.06.2013, 20:52 #4
Не нужно никаких пространств имен. Просто определить функцию в заголовочном файле и добавить защиту от повторного включения. cpp-файл не нужен в таком случае. Но это в общем случае изврат.
0
nill
10 / 10 / 0
Регистрация: 16.08.2009
Сообщений: 417
17.06.2013, 21:52  [ТС] #5
Tulosba,
можно пример схемы как это сделать ?

я пробовал и #pragma once и #ifndef #define
в h-файле с функцией прописывать но это мне постоянно дает ошибку
типа
test.obj : error LNK2005: "void __cdecl test(void)" (?test@@YAXXZ) уже определен в stdafx.obj

и про изврат можно подробней, как лучше то сделать ?

сейчас постоянно обновляю два файла срр файл с телом функции и h файл с прототипом этой функции, вот это изврат
куда удобней все делать в одном файле, но не получаеться
я не против и прототип и тело функции писать в одном файле, но тоже не пашет
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
17.06.2013, 22:04 #6
C++
1
2
3
4
5
6
7
8
//myheader.h
#ifndef MY_HEADER_H
#define MY_HEADER_H
 
void test(){
int i=0;
}
#endif
включайте этот файл куда надо и вызывайте test();
Цитата Сообщение от nill Посмотреть сообщение
сейчас постоянно обновляю два файла срр файл с телом функции и h файл с прототипом этой функции, вот это изврат
Вас пугает в процессе разработки держать заголовочный файл в соответствии с файлом реализации, или что?
Цитата Сообщение от nill Посмотреть сообщение
и про изврат можно подробней, как лучше то сделать ?
Изврат в том, что в каждом модуле, куда будет включен хедер, будет своя версия функций. Т.е. итоговый файл разбухнет из-за многократного дублирования кода.
1
nill
10 / 10 / 0
Регистрация: 16.08.2009
Сообщений: 417
17.06.2013, 22:19  [ТС] #7
Tulosba,


этот пример не работает, создавал пустое консольное приложение в VS2010

вот проект http://webfile.ru/6568268
в упор не вижу в чем проблема
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
17.06.2013, 22:41 #8
nill, добавьте inline или static для функции:
C++
1
2
3
static void test(){
    int i=0;
}
1
nill
10 / 10 / 0
Регистрация: 16.08.2009
Сообщений: 417
17.06.2013, 23:51  [ТС] #9
Tulosba,
Вот теперь заработало спасибо!

А если кратко в чем отличия inline и static, как то мало инфы про них

И еще

Вас пугает в процессе разработки держать заголовочный файл в соответствии с файлом реализации, или что?
Если речь о том что для каждого срр файла с функциями нужен свой h файл то да пугает, это надо под каждую функцию делать ее прототип в h файле, очень не удобно и долго когда в функции много входящих параметров. Что тут удобного то ?


Изврат в том, что в каждом модуле, куда будет включен хедер, будет своя версия функций. Т.е. итоговый файл разбухнет из-за многократного дублирования кода.
То есть скомпилированное exe будет большего размера и все ? на скорость работы программы это не повлияет ?
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
18.06.2013, 11:09 #10
Цитата Сообщение от nill Посмотреть сообщение
А если кратко в чем отличия inline и static, как то мало инфы про них
static делает функцию локальной относительно модуля (единицы трансляции), т.е. в других модулях она будет недоступна.
inline встраивает тело функции вместо ее вызова. Но это всего лишь рекомендация компилятору, т.е. встраивание может быть и не достигнуто.

Цитата Сообщение от nill Посмотреть сообщение
Что тут удобного то ?
Это необходимо для обеспечения однопроходного режима компилятора. Может быть Вы на какой-нибудь C# засмотрелись. Там заголовочных файлов нет.

Цитата Сообщение от nill Посмотреть сообщение
То есть скомпилированное exe будет большего размера и все ? на скорость работы программы это не повлияет ?
Зато точно повлияет на скорость компиляции и время загрузки программы. В общем, дублирование кода в любых проявлениях, в большинстве случаев - зло.
1
nill
10 / 10 / 0
Регистрация: 16.08.2009
Сообщений: 417
18.06.2013, 17:04  [ТС] #11
static делает функцию локальной относительно модуля (единицы трансляции), т.е. в других модулях она будет недоступна.
inline встраивает тело функции вместо ее вызова. Но это всего лишь рекомендация компилятору, т.е. встраивание может быть и не достигнуто.
Не могу понять а что же лучше использовать ?
Схема использования такая в гланывый .h файл будет включены инклуды на .сpp файлы с функциями и ко всем файлам проекта будет подключен только один главный .h файл, то есть во всех файлах проекта будут доступны все функции
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
18.06.2013, 17:21 #12
Цитата Сообщение от nill Посмотреть сообщение
будет подключен только один главный .h файл, то есть во всех файлах проекта будут доступны все функции
Для таких действий имеет смысл иметь какой-то инструмент, который будет автоматически генерить такой хедер.
Нечто подобное я видел под QNX в Photon Application Builder. Генерился файл proto.h с прототипами всех не static функций проекта.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.06.2013, 17:21
Привет! Вот еще темы с ответами:

Как можно включить функцию подсветки кода в rad studio 2010 - Delphi
Подскажите , как можно включить функцию подсветки кода в rad studio 2010. Так чтобы можно было отыскать конец или начало цикла или блока...

Как можно удобно использовать сеты иконок, которые в одном файле? - C++ Builder
Доброе время суток. Есть ли возможность юзать подобные сеты рисунков, как множество иконок(к примеру для кнопок) средствами билдера? Чтобы...

Можно ли на javascript'e в одном js-файле использовать функции, описанные в другом js-файле? - JavaScript
Подскажите, плз, можно ли на javascript'e в одном js-файле использовать функции, описанные в другом js-файле? (который лежит на другом...

Как открыть все файлы в одном каталоге - Delphi
Есть каталог, с неизвестными (в смысле названия)) txt файлами. как в открыть все эти файлы? в цикле желательно


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

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

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