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

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

Восстановить пароль Регистрация
 
sitesv
24 / 22 / 2
Регистрация: 22.04.2010
Сообщений: 654
02.07.2010, 14:34     Си, использование вложенных файлов *.c #1
Всем доброго времени дня!
Вопрос:
Пишу программу на 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++ Использование файлов
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vladiator
 Аватар для Vladiator
1565 / 635 / 25
Регистрация: 24.02.2009
Сообщений: 9,268
02.07.2010, 14:49     Си, использование вложенных файлов *.c #2
Цитата Сообщение от sitesv Посмотреть сообщение
#include <utils.c>
если здесь кавычки поставить вместо "<>"?
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
02.07.2010, 14:50     Си, использование вложенных файлов *.c #3
В главном модуле (main.c) пропиши прототипы функций из utils.c с ключевым словом extern. Никаких "include" не надо.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 319
Регистрация: 30.03.2009
Сообщений: 14,121
Записей в блоге: 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
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
02.07.2010, 15:08     Си, использование вложенных файлов *.c #5
Evg, поправьте, если ошибаюсь - а в utils.h функция как extern объявлена, чтобы можно было по отдельности main.c и utils.c компилировать? Я не объявляя в заголовках функции как extern компилировал так
gcc -o trampampam main.c utils.c
и всё вроде бы нормально получалось... Разъясните, пожалуйста...
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 319
Регистрация: 30.03.2009
Сообщений: 14,121
Записей в блоге: 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
Ответ Создать тему
Опции темы

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