C :различия между объявлением прототипа в заголовке и объявлением функции для реализации?

StackOverflow https://stackoverflow.com/questions/719189

  •  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 поймают эту ошибку и выдадут предупреждение / ошибку, если несоответствующий прототип # включен в реализацию.Если у вас несовпадающие прототипы, вы можете столкнуться с проблемами, варьирующимися от незначительных до мгновенного сбоя.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top