Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
nill
10 / 10 / 2
Регистрация: 16.08.2009
Сообщений: 417
1

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

17.06.2013, 18:23. Просмотров 819. Ответов 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
Ответы с готовыми решениями:

Как можно объединить эти файлы? Что бы было в одном файле
<form action="testreg.php" method="post"> <p> <label>Ваш логин:<br></label>...

Как присоединить к h файлу проекта и к cpp проекта файлы из папки, лежащей с ними на одном уровне
Добрый день, такая задача, Пользуюсь RAD 2010 Хочу в папке проекта создать...

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

Типизированные файлы: в одном файле заменить все минимальные числа на максимальные
Например вводим 1 1 1 2 3 4 5 5, а должны получить 5 5 5 2 3 4 5 5

Окно, разделенное сплитом на 3 части. Как распределить код, чтобы он не находился в одном файле проекта
У меня в программе главное окно, разделенное сплитом на 3 части, где дерево,...

11
MastAKK
145 / 136 / 18
Регистрация: 13.10.2012
Сообщений: 592
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 / 2
Регистрация: 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
:)
Эксперт С++
4749 / 3243 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
17.06.2013, 20:52 4
Не нужно никаких пространств имен. Просто определить функцию в заголовочном файле и добавить защиту от повторного включения. cpp-файл не нужен в таком случае. Но это в общем случае изврат.
0
nill
10 / 10 / 2
Регистрация: 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
:)
Эксперт С++
4749 / 3243 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
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 / 2
Регистрация: 16.08.2009
Сообщений: 417
17.06.2013, 22:19  [ТС] 7
Tulosba,


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

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

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

И еще

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


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

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

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

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

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

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


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

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

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