Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
11 / 11 / 2
Регистрация: 16.08.2009
Сообщений: 434

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

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

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

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

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

Сейчас чтобы функция была доступна во всех файлах проекта я делаю описание функции в .cpp файле и описываю прототип функции в .h файле после чего включаю инклудом этот файл, после чего функция становиться доступна, хочу это все упростить и делать все в одном файле
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.06.2013, 18:23
Ответы с готовыми решениями:

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

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

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

11
 Аватар для MastAKK
148 / 139 / 18
Регистрация: 13.10.2012
Сообщений: 592
17.06.2013, 18:37
Нужно создать пространство имен с методом 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
11 / 11 / 2
Регистрация: 16.08.2009
Сообщений: 434
17.06.2013, 20:16  [ТС]
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
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
17.06.2013, 20:52
Не нужно никаких пространств имен. Просто определить функцию в заголовочном файле и добавить защиту от повторного включения. cpp-файл не нужен в таком случае. Но это в общем случае изврат.
0
11 / 11 / 2
Регистрация: 16.08.2009
Сообщений: 434
17.06.2013, 21:52  [ТС]
Tulosba,
можно пример схемы как это сделать ?

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

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

сейчас постоянно обновляю два файла срр файл с телом функции и h файл с прототипом этой функции, вот это изврат
куда удобней все делать в одном файле, но не получаеться
я не против и прототип и тело функции писать в одном файле, но тоже не пашет
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
17.06.2013, 22:04
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
11 / 11 / 2
Регистрация: 16.08.2009
Сообщений: 434
17.06.2013, 22:19  [ТС]
Tulosba,


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

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

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

И еще

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


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

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

Цитата Сообщение от nill Посмотреть сообщение
То есть скомпилированное exe будет большего размера и все ? на скорость работы программы это не повлияет ?
Зато точно повлияет на скорость компиляции и время загрузки программы. В общем, дублирование кода в любых проявлениях, в большинстве случаев - зло.
1
11 / 11 / 2
Регистрация: 16.08.2009
Сообщений: 434
18.06.2013, 17:04  [ТС]
static делает функцию локальной относительно модуля (единицы трансляции), т.е. в других модулях она будет недоступна.
inline встраивает тело функции вместо ее вызова. Но это всего лишь рекомендация компилятору, т.е. встраивание может быть и не достигнуто.
Не могу понять а что же лучше использовать ?
Схема использования такая в гланывый .h файл будет включены инклуды на .сpp файлы с функциями и ко всем файлам проекта будет подключен только один главный .h файл, то есть во всех файлах проекта будут доступны все функции
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
18.06.2013, 17:21
Цитата Сообщение от nill Посмотреть сообщение
будет подключен только один главный .h файл, то есть во всех файлах проекта будут доступны все функции
Для таких действий имеет смысл иметь какой-то инструмент, который будет автоматически генерить такой хедер.
Нечто подобное я видел под QNX в Photon Application Builder. Генерился файл proto.h с прототипами всех не static функций проекта.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.06.2013, 17:21
Помогаю со студенческими работами здесь

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

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


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru