Определение имени функции в c - PullRequest
3 голосов
/ 24 февраля 2009

Как работает определение имени функции для нескольких файлов C?

Я портирую стандартный проект набора инструментов gnu на iPhone OS и использую Xcode для этого.

Код строится через make, но не через xcode. при сборке через xcode компоновщик жалуется, что один и тот же символ (функция) определен в двух объектах. в коде есть два разных исходных файла, которые #include представляют собой общий файл между ними. Хотя ... странно (по крайней мере для меня), похоже, работает для стандартного набора инструментов. какие-нибудь идеи, если это что-то, что по-другому обрабатывается стандартным make-файлом?

Ответы [ 4 ]

4 голосов
/ 24 февраля 2009

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

Вы нарушили одно правило определения.

Возможно, у одного из ваших заголовков есть определение для переменной. Например: в common.h у вас есть

int foo = 42;

изменить его на:

extern int foo; // a declaration

, а затем создайте файл common.c, в который вы поместите определение:

int foo = 42;
3 голосов
/ 24 февраля 2009

В C, если я правильно помню, имена функций static являются локальными по отношению к исходному файлу, в котором они определены, но все другие имена функций существуют в глобальном пространстве имен. Так что если у вас есть file1.c с

void fn1() {}
static void fn2() {}

и file2.c с

void fn1() {}
static void fn2() {}

и вы пытались скомпилировать их чем-то вроде

cc file1.c file2.c

тогда вы получите конфликт имен между fn1 в file1.c и fn1 в file2.c, но не между двумя fn2 функциями (потому что они статические). (Конечно, вы также получили бы кучу других ошибок, потому что эта программа ничего не делает , но они не относятся к области видимости.)

1 голос
/ 24 февраля 2009

Если он компилируется без ошибок из Makefile, но не из вашего проекта XCode, это, скорее всего, потому, что параметры компилятора устанавливаются по-разному в двух средах. Проверьте Makefile, чтобы увидеть, какие параметры передаются в 'gcc'. В частности, возможно, что дубликаты определений скомпилированы с условием #ifdef, и вам может понадобиться добавить некоторые определения препроцессора в настройки вашего проекта XCode.

1 голос
/ 24 февраля 2009

Я предполагаю, что общий заголовок определяет встроенную функцию, которая приводит к дублированию символа. Если это так, добавьте к этим функциям префикс static inline или определите их как inline с объявлением extern в другом файле .c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...