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

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

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

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

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

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

Использование переменной с других файлов C++
Использование файлов и строк C++
Использование типизированных и двоичных файлов. C++
использование файлов(модулей) C++
C++ Использование файлов
C++ Использование цикла while и вложенных циклов
Перекрестное использование .h файлов и классов C++
Использование вложенных счетных циклов для работы с делителями чисел C++
C++ Извлечение WAV - файлов из ресурсов и их использование
Использование строк и файлов C++
Организация вывода с использование вложенных циклов C++
C++ Создание и использование заголовочных файлов

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vladiator
 Аватар для Vladiator
1564 / 634 / 25
Регистрация: 24.02.2009
Сообщений: 9,268
02.07.2010, 14:49     Си, использование вложенных файлов *.c #2
Цитата Сообщение от sitesv Посмотреть сообщение
#include <utils.c>
если здесь кавычки поставить вместо "<>"?
Nameless One
Эксперт С++
 Аватар для Nameless One
5760 / 3409 / 255
Регистрация: 08.02.2010
Сообщений: 7,406
02.07.2010, 14:50     Си, использование вложенных файлов *.c #3
В главном модуле (main.c) пропиши прототипы функций из utils.c с ключевым словом extern. Никаких "include" не надо.
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
17188 / 5442 / 337
Регистрация: 30.03.2009
Сообщений: 14,758
Записей в блоге: 26
02.07.2010, 14:55     Си, использование вложенных файлов *.c #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"
easybudda
Эксперт С++
 Аватар для easybudda
9412 / 5435 / 917
Регистрация: 25.07.2009
Сообщений: 10,428
02.07.2010, 15:08     Си, использование вложенных файлов *.c #5
Evg, поправьте, если ошибаюсь - а в utils.h функция как extern объявлена, чтобы можно было по отдельности main.c и utils.c компилировать? Я не объявляя в заголовках функции как extern компилировал так
gcc -o trampampam main.c utils.c
и всё вроде бы нормально получалось... Разъясните, пожалуйста...
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
17188 / 5442 / 337
Регистрация: 30.03.2009
Сообщений: 14,758
Записей в блоге: 26
02.07.2010, 15:33     Си, использование вложенных файлов *.c #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 минуту
Разработчики Си++ учли эту особенность и запретили вызов функции без описания. Хотя на это были в том числе и другие причины, но тем не менее на Си++ вариант без описания не прокатит
Yandex
Объявления
02.07.2010, 15:33     Си, использование вложенных файлов *.c
Ответ Создать тему
Опции темы

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