LINUX.ORG.RU

В чем различие без и с .h

 


0

1

Читаю ман по созданию проекта из нескольких файлов.

Мол,

nano -w main.c
# пишем ф-ю foo как extern.
nano -w bar.c
# пишем ф-ю foo
gcc -c main.c bar.c
gcc main.o bar.o -o foobar
./foobar
При этом открываю в интернете другой ман, который говорит, что надо лепить .h:
nano -w main.c
# Подключаем "foo.h"
nano -w foo.h
# Пишем описание ф-ии
nano -w foo.c
# Пишем функцию
gcc -c main.c foo.c
gcc main.o foo.o -o foobar
./foobar

В чем профит каждого из методов?

1. В первом профитов нет.

2. Во втором нет дублирования объявлений функций и внешних переменных и определения типов.

Begemoth ★★★★★
()

Мысль такова, что перед использованием функции из другого файла bar.c, надо объявить ее прототип в foo.c. При этом исходника bar.c может не быть, а даже если он есть, то писать все прототипы всех функций во всех нужных своих файлах как-то лень, что ли.

metar ★★★
()

extern, если только это не extern «C» не имеет смысла. Получается первый вариант это то же самое что и второй, только прототипы явно объявляются в каждом *.c файле. Использование *.h файлов компактнее.

Vinick ★★
()
Ответ на: комментарий от AlexCones

А foo.h уже не считается?

Ты же его включаешь и в foo.с. Или ты прототипы функций считаешь за дублирование?

Begemoth ★★★★★
()
Ответ на: комментарий от Vinick

extern, если только это не extern «C» не имеет смысла

Для синглтонов в заголовочном файле имеет. Правда, имеют ли смысл синглтоны в Си... Но в ObjC я так делаю.

note173 ★★★★★
()
Ответ на: комментарий от lazyklimm

И, да, это привет из 70-х.

Я так и понял.

Ну ладно, буду использовать .h.

AlexCones ★★★
() автор топика
Ответ на: комментарий от AlexCones

следовательно про экземпляры класса.

Для реализации синглтонов extern не нужен. Эта идиома в частности происходит от отсутствия в языке глобальных переменных и следовательно всяких extern.

Begemoth ★★★★★
()
Ответ на: комментарий от note173

А как тогда реализовать совсем глобальную переменную

А чем глобальная переменная отличается от совсем глобальной? А вообще, указатель на синглтон может возвращаться функцией.

Begemoth ★★★★★
()
Ответ на: комментарий от Begemoth

Глобальная переменная должна где-то жить. Как сделать глобальную переменную в единственном экземпляре, объявляемую в заголовочном файле, без extern?

note173 ★★★★★
()
Ответ на: комментарий от note173

Глобальная переменная должна где-то жить. Как сделать глобальную переменную в единственном экземпляре, объявляемую в заголовочном файле, без extern?

Глобальную переменную - никак, но указатель на глобальный объект может возвращать функция (а она в свою очередь может хранить указатель на глобальный объект в статиечской переменной).

Begemoth ★★★★★
()
Ответ на: комментарий от note173

Как сделать глобальную переменную в единственном экземпляре, объявляемую в заголовочном файле, без extern?

вот так:

/* h.h */
int foo;
void print();
/* a.c */
#include "h.h"

int main(){
	foo = 42;
	print();
	return 0;
}
/* b.c */
#include "h.h"
#include<stdio.h>

void print(){
	printf("foo is %d\n", foo);
}
$ gcc -z muldefs a.c b.c
$ /a.out
foo is 42

но зачем?

anonymous
()
Ответ на: комментарий от AlexCones

Почувствуй разницу между объявление и определением

anonymous
()

Поедлись ссылкой на ман, пожалуйста.

bhfq ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.