C: различия между объявлением прототипа в заголовке и объявлением функции для реализации? - PullRequest
1 голос
/ 05 апреля 2009

Мне было интересно узнать о небольших различиях между объявлением прототипов функций в заголовках и в файлах .c. У меня есть заголовок с некоторыми функциями-прототипами и некоторые файлы .c с реальной реализацией этих функций. Внесены некоторые изменения в заголовок, добавлен только квалификатор «__restrict» (распознается gcc). Мой вопрос заключается в том, нужно ли мне ставить спецификатор "__restrict" в файлах .c (в настоящее время код компилируется, поэтому я думаю, что ответ - нет, но некоторая точность будет оценена).

Это работает для каждого классификатора C? Могу ли я добавить некоторые «const» или «volatile» в заголовок без необходимости делать то же самое в .c файлах?

в данный момент в шапке:

int myfunc_gettype (const mytype *__restrict, int *__restrict);

и в файле реализации:

int myfunc_gettype(const mytype *attr, int *type)

Ответы [ 3 ]

5 голосов
/ 05 апреля 2009

Вы должны . Несоответствие вызывает неопределенное поведение. Есть ли какая-то причина, по которой вы хотите иметь отдельные объявления в заголовке и при определении?

Обратите внимание, что ключевое слово restrict, а не __restrict, являющееся расширением поставщика (подсказка: посмотрите на _ перед именем ключевого слова). Вы должны придерживаться стандартной версии для мобильности.

0 голосов
/ 05 апреля 2009

С gcc 4.0.1 это зависит от того, является ли const бессмысленным:

// Who cares, compiles fine, but irks the maintenance programmer.

// f.h
int f(const int i);

// f.c
int f(int i) { return i += 42; }


// No no no no Your Types Conflict gcc will not stand for it

// f.h
int f(const int *pi);

// f.c
int f(int *pi) { return (*pi)+= 42; }
0 голосов
/ 05 апреля 2009

ПРИМЕЧАНИЕ. Вы фактически не добавили квалификатор restrict. У вас просто есть разные (необязательные) имена переменных в прототипе.

Что касается вашего вопроса, большинство хороших компиляторов Си поймут эту ошибку и выдадут предупреждение / ошибку, если несоответствующий прототип # включен в реализацию. Если у вас есть несовпадающие прототипы, вы можете столкнуться с проблемами, варьирующимися от незначительного до мгновенного сбоя.

...