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

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

Войти
Регистрация
Восстановить пароль
 
sitesv
24 / 22 / 2
Регистрация: 22.04.2010
Сообщений: 663
#1

Си, использование вложенных файлов *.c - C++

02.07.2010, 14:34. Просмотров 1032. Ответов 5
Метки нет (Все метки)

Всем доброго времени дня!
Вопрос:
Пишу программу на C под Linux. есть файл main.c, в котором у меня располагается основное тело программы, функции итд...
Но считаю это избыточным, хочу функции вывести в другой сишный файл, к примеру utils.c... Как использовать функции в utils.c вызывая их из main.c?
В main.c делал #include <utils.c>, но не помогло...Прописывал в utils.c вначале все нижеперечисленные функции, ставил перед типом позвращаемой функцией переменной extern, но тоже не помогло...
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.07.2010, 14:34
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Си, использование вложенных файлов *.c (C++):

Использование цикла while и вложенных циклов - C++
1. Используя цикл while, напишите программу, вычисляющую сумму цифр заданного целого числа. Например, суммой цифр числа 2155 будет 2 + 1 +...

Организация вывода с использование вложенных циклов - C++
Напечатать числа в виде следующей таблицы:

Использование вложенных счетных циклов для работы с делителями чисел - C++
Для каждого числа от 1 до &quot;n&quot; определить, является ли оно простым.

Использование файлов - C++
Здравствуйте, нужна помощь в решении задания. Я новичек и пока еще немогу сама разобраться. В файле хранится информация по ...

использование файлов(модулей) - C++
х3 как называется эта фигня, но она мне нужна. в паскале есть такая вещь как UNIT. то есть использование в программе функций которые...

Использование строк и файлов - C++
С помощью текстового редактора создать файл, содержащий текст, длина которого не превышает 1000 символов (длина строки текста не должна...

5
Vladiator
1567 / 637 / 25
Регистрация: 24.02.2009
Сообщений: 9,269
02.07.2010, 14:49 #2
Цитата Сообщение от sitesv Посмотреть сообщение
#include <utils.c>
если здесь кавычки поставить вместо "<>"?
0
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
02.07.2010, 14:50 #3
В главном модуле (main.c) пропиши прототипы функций из utils.c с ключевым словом extern. Никаких "include" не надо.
0
Evg
Эксперт CАвтор FAQ
18026 / 6258 / 427
Регистрация: 30.03.2009
Сообщений: 17,184
Записей в блоге: 27
02.07.2010, 14:55 #4
Коротенький пример:

C
1
2
3
4
5
6
7
/* Файл main.c */
#include "utils.h"
 
int main (void)
{
  trampampam();
}
C
1
2
3
4
5
6
7
8
9
10
11
/* Файл utils.c */
#include <stdio.h>
/* Эту строку теоретически можно и опустить, но желательно оставить для
 * страховки от того, что функции не совпадут с прототипами (т.е. для
 * страховки от собственных ошибок) */
#include "utils.h"
 
void trampampam (void)
{
  printf ("trampampam\n");
}
C
1
2
3
4
5
6
7
/* Файл utils.h */
#ifndef __UTILS_H__
#define __UTILS_H__
 
extern void trampampam (void);
 
#endif /* __UTILS_H__ */
Код
$ gcc main.c -c
$ gcc utils.c -c
$ gcc main.o utils.o
$ ./a.out
trampampam
Добавлено через 4 минуты
Это некая "правильная" реализация. Но новичков такая реализация почему-то всегда пугает и они предпочитают всякого рода "неправильные". В "неправильном" случае нужно делать то, что сказал Kidalvь: использовать кавычки вместо уловых скобок:

C
1
#include "utils.c"
2
easybudda
Модератор
Эксперт CЭксперт С++
9677 / 5627 / 953
Регистрация: 25.07.2009
Сообщений: 10,801
02.07.2010, 15:08 #5
Evg, поправьте, если ошибаюсь - а в utils.h функция как extern объявлена, чтобы можно было по отдельности main.c и utils.c компилировать? Я не объявляя в заголовках функции как extern компилировал так
gcc -o trampampam main.c utils.c
и всё вроде бы нормально получалось... Разъясните, пожалуйста...
1
Evg
Эксперт CАвтор FAQ
18026 / 6258 / 427
Регистрация: 30.03.2009
Сообщений: 17,184
Записей в блоге: 27
02.07.2010, 15:33 #6
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
easybudda, грубо говоря, да. Описание нужно для того, чтобы компилятор знал, как загружать параметры. По стандарту Си можно делать вызов функции без описания. При этом параметры будут "as is" - т.е. тех типов, которые прописаны в вызове. Это может привести к ошибкам. Например

C
1
2
/* Файл 1 */
func (1, 2);
C
1
2
3
4
5
/* Файл 2 */
void func (double x, double y)
{
  ...
}
При компиляции файла 1 если не подцепитьпрототип функции func, то компилятор построит код так, как будто бы функция имеет два int'а в параметрах (поскольку поданы целочисленные константы 1 и 2). Если подцепить описание, то компилятор перед загрузкой параметра сделает преобразование int -> double

Добавлено через 1 минуту
Разработчики Си++ учли эту особенность и запретили вызов функции без описания. Хотя на это были в том числе и другие причины, но тем не менее на Си++ вариант без описания не прокатит
4
02.07.2010, 15:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.07.2010, 15:33
Привет! Вот еще темы с ответами:

Использование файлов и строк - C++
Уважаемые программисты! Нужна ваша помощь, заканчиваю написание диплома и возникла следующая проблемка: Есть программа, которая все...

Перекрестное использование .h файлов и классов - C++
Добрый вечер! Никак не могу придумать запрос, по которому гуглить, поэтому обращаюсь к вам за помощью. Суть проблемы такова. Имеются...

Использование типизированных и двоичных файлов. - C++
САМО ЗАДАНИЕ: &quot;Выяснить, в каких классах насчитывается более 35 учащихся&quot; К выполнению задания ТРЕБУЕТСЯ: • Все задания выполняются...

Использование переменной с других файлов - C++
Привет всем! А как сделать так, чтобы переменную определенную в одном .cpp файле можно было бы использовать в остальных...


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

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

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