Точное значение "extern" в C и эквивалентность имени файла заголовка к имени файла кода - PullRequest
2 голосов
/ 02 ноября 2010

Я гуглил и читал, но не нашел ответов на эти три простых вопроса ...

  1. Должно ли имя файла заголовка совпадать с именем файла кода? Например, у меня есть функция void foo (), объявленная в foo.h. Он используется в main.c, который включает foo.h. Должен ли foo () быть реализован в foo.c? Что если это будет реализовано в foox.c? Потому что у меня есть исходный код, который имеет заголовок decoder.h, но файл кода decode.c, и все, кажется, работает. В проекте нет ни файлов decoder.c, ни decode.h.

  2. Что означает «extern», когда функции объявляются с помощью «extern». В указанном проекте decoder.h объявляет внешние функции, а decode.c их реализует. Как extern работает здесь и как он на самом деле должен работать? Я всегда думал, что extern используется, чтобы сообщить компилятору, что он найдет это где-то еще (как я объявляю переменную в main.c, которая включает foo.h, в foo.c, которая реализует функции из foo.h. значение переменной, поэтому я объявляю его как extern).

  3. Кроме того, второстепенный вопрос о синтаксисе C, у меня есть код, у которого есть реализации функций, которые выглядят так

    int function(param1,param2,param3)
    int param1,*param2;
    char param3;
    {
        function body
    }
    

    Мой Qt Creator жалуется на этот код, и навигация по коду не работает, но код компилируется и выполняется хорошо. Что это за синтаксис? Я никогда не видел это раньше ...

Ответы [ 2 ]

6 голосов
/ 02 ноября 2010
  1. Языку C не важно, что вы называете исходными файлами и файлами заголовков. Вы можете использовать любые имена, которые примет ваш компилятор, и поместить любую функцию в любой файл .c, который вы пожелаете. Некоторые другие инструменты могут заботиться, но язык - нет. Действительно, языку не важно, если вы назовете свой исходный файл bar.source вместо foo.c (но, опять же, ваш компилятор может).

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

  3. Синтаксис, который вы показываете, является действительно старым синтаксисом для определения функций. Он использовался до первого стандарта С, до конца 1980-х годов. Не используйте его больше. Правила обработки типов аргументов архаичны и излишне сложны, а использование объявлений и определений функций нового стиля устраняет все плохое.

Ваш пример лучше записать как:

int function(int param1, int *param2, char param3)
{
    function body
}

Единственная проблема заключается в том, что функции старого стиля не могут передавать char в качестве аргумента, поэтому последний параметр должен действительно быть int param3.

0 голосов
/ 02 ноября 2010

1) Нет никаких требований к именованию заголовков. Общепринято использовать одно и то же имя для файлов .h и .c.

2) Extern используется для указания связи. Это может быть переменная, которая объявлена ​​в другом заголовке или исходном файле. Это также может быть для объявления связи на другом языке, например extern "c".

3) Этот синтаксис является оригинальным синтаксисом K & R c. Это очень старый.

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