Использование ключевого слова extern для вызова функций

Я хочу вызвать функции, определенные в test.c из other.c.

Могу я extern function1 называть это? Кроме того, я должен использовать extern в function2 а также function3которые называются function1?

other.c

extern function1();
function1();

test.c

void function1()
{
    function2();
    function3();
}

void function2()
{

}

void function3()
{

}

4 ответа

На самом деле каждая функция по умолчанию является extern:) - если вы не объявите, что она не:). Достаточно, если у вас есть прототип перед первым вызовом;

int xxx(int, int, float, double);  // prototype


int main(void)
{
  int x,y;
  float z;
  double v;

  xxx(x,y,z,v);

  return 0;
}

Функция может быть в другом.c файле. Вам необходимо включить объектный файл в ссылку.

int xxx(int a, int b, float c, double d)
{
  int result;
  /* do something */

  return result;
}

Объявления функций "по умолчанию" extern,

квотирование C11 Глава §6.2.2, (выделение мое)

Если объявление идентификатора для функции не имеет спецификатора класса хранения, его связь определяется точно так же, как если бы она была объявлена ​​с помощью спецификатора класса хранения extern , [...]

Таким образом, вам не нужно быть откровенным об этом.

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

extern просто говорит нам, что это определено где-то еще. И вы используете его в файле, который вы пишете extern, Но функции по умолчанию внешние. Так что вам не нужно быть откровенным об этом.

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

Простой пример

Первый исходный файл test1.c

extern void function1(void);  // "Import" a function from another translation unit

int main(void)
{
    function1();  // Can call the declared function
}

Тогда второй исходный файл test2.c:

void function2(void)
{
    // Do something
}

void function1(void)
{
    function2();  // No extern needed, it's declared (and defined)
                  // in the same translation unit
}

Как вы можете увидеть функцию function2 не нужно никаких extern декларация где угодно. Используется только в test2.c так только function1 нужно знать об этом.

Однако в test1.c main функция должна знать о function1 потому что он вызывается, тогда мы делаем предварительное объявление прототипа функции. Это делается с помощью extern ключевое слово. Но для объявления функций extern Ключевое слово на самом деле не нужно, так как они всегда считаются "внешними" (как отметил Питер).

Другие вопросы по тегам