C :различия между объявлением прототипа в заголовке и объявлением функции для реализации?
-
23-08-2019 - |
Вопрос
Меня интересовали небольшие различия между объявлением прототипов функций в заголовках и в файлах .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)
Решение
Ты должен.Несоответствие вызывает неопределенное поведение.Есть ли какая-то причина, по которой вы хотите иметь отдельные объявления в заголовке и в определении?
Хорошо обратите внимание, что ключевое слово restrict
в отличие от __restrict
который является расширением поставщика (подсказка:посмотрите на _
's перед названием ключевого слова).Вы должны придерживаться стандартной версии для удобства переносимости.
Другие советы
С 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; }
ПРИМЕЧАНИЕ:На самом деле вы не добавили квалификатор 'restrict'.У вас просто разные (необязательные) имена переменных в прототипе.
Что касается вашего вопроса, большинство хороших компиляторов C поймают эту ошибку и выдадут предупреждение / ошибку, если несоответствующий прототип # включен в реализацию.Если у вас несовпадающие прототипы, вы можете столкнуться с проблемами, варьирующимися от незначительных до мгновенного сбоя.