наличие одной и той же функции в нескольких исходных файлах c

StackOverflow https://stackoverflow.com/questions/20353267

  •  25-08-2022
  •  | 
  •  

Вопрос

Мне трудно понять, почему я не могу использовать одну и ту же функцию в нескольких исходных файлах C.Я всегда думал, что я не могу получить доступ к функциям в другом исходном файле до тех пор, пока они не объявлены в заголовочном файле.

Давайте предположим, что у меня есть следующее:

main.c -> включает thread1.h и thread2.h

thread1.h -> объявляет, напримерvoid * thread1();

thread1.c -> определяет void * thread1(){} и определяет void lock(){}

thread2.h -> объявляет, напримерvoid * thread2();

thread2.c -> определяет void * thread2(){} и определяет void lock(){}

Теперь gcc говорит мне, что я не могу этого сделать!

исполняемый файл gcc -pthread -Wall -o main.c thread1.c thread2.c

ОШИБКА:множественное определение термина "блокировка"

Итак, теперь мой вопрос таков: Как я могу достичь того, чего я хочу?

Я не думаю, что это должно быть невозможно.В противном случае весь исходный код C, доступный во всех многочисленных библиотеках C, должен был бы быть уникальным.(нет, это не имело бы никакого смысла, или не так ли?)

Итак, около 3 часов назад я подумал про себя, что должно быть решение.Что я, должно быть, чего-то здесь не понимаю.

Ну , я попробовал погуглить это ...но почему-то мои навыки работы с Google на этот раз мне не помогли.Неужели действительно нет никакого способа сделать это?Или я просто слишком глуп, чтобы искать это?

Заранее благодарю,

лип

Это было полезно?

Решение

Вам понадобится эта функция lock() быть static.

static void lock() {..}

Причина в том, что функции с static не видны за пределами "единицы перевода".Другими (вероятно, неправильными) словами, статическими функциями являются Частное в файл *.c.Следовательно, они не вызывают ошибок связывания на этапе связывания, как это происходит у вас в данный момент.

Другие советы

Вы должны объявить блокировку как static void lock(){}.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top