2013-08-13 2 views
4

Являются ли типы этих двух деклараций совместимыми типами?Совместимые типы и классификаторы типов аргументов

void f(char *, char *); 
void f(char *restrict, char *restrict); 

или аналогичным образом:

void g(char *); 
void g(char *const); 

Я с трудом находя что-либо в стандарте, который охватывает этот вопрос. Меня в основном интересует тема о том, действительно ли он предназначен для прототипа функции вручную, опустив ключевое слово ограничения, где фактический тип может иметь ограниченные аргументы в зависимости от версии C или версии других используемых библиотек.

+1

Да, они совместимы; * идет, выкапывая стандартную цитату * – Christoph

ответ

3

С11 раздел 6.7.6.3 §15.:

При определении совместимости типов и составного типа каждый параметр, объявленный с помощью функции или типа массива, принимается как имеющий скорректированный тип и , каждый параметр, объявленный с использованием квалифицированного типа, принимается как имеющий неквалифицированную версию объявленного type.

+0

Мне было трудно определить, какой ответ принять, но я увидел, что «38 минут назад» изменилось на «39 минут назад» на ваш ответ, прежде чем он ответил на ответ оуа, так что это ваше. :-) –

+1

@R .. Вы можете навешивать метку времени на ответы и видеть точное время, когда ответы были опубликованы. Фактически ouah отправил свой ответ за 18 секунд до того, как Кристоф сделал. Выбор за вами конечно ;-) –

+0

@KingsIndian: в моей защите мой комментарий предшествует его и моим ответам – Christoph

1

Имена аргументов в прототипе не имеют значения, поэтому эти определения эквивалентны. Однако это хорошая практика, чтобы поместить имена, поскольку они должны дать представление о том, для чего предназначены аргументы. Технически они не нужны, но служат документацией.

Другое дело с квалификатором const, потому что это изменяет значение функции.

+0

Это не имена аргументов в моих списках аргументов, а только типы классификаторов. –

+0

И неясно, что 'const' изменяет« подпись »функции. 'Const' не применяется к указанному типу. Он применяется к объекту автоматического хранения, который получает значение внутреннего аргумента функции, которое является деталью реализации функции, а не частью его интерфейса. –

+0

@R .., Вы правы, подпись - это неправильное слово, я изменил его на смысл, что также кажется неправильным, но я не знаю, как лучше поместить его на английском языке. – Devolus

4

Они совместимы:

(C99, 6.7.5.3 Функция declarators (включая прототипы) p15) «[...] (при определении совместимости типа и составного типа, каждый параметр объявленный с функцией или массивом типа принимается как имеющий тип и скорректированного каждый параметром, объявленный с квалифицированным типом берутся как имеющие неквалифицированную версией своего заявленного типа)»

+0

Извините за мое неправильное определение того, кто выложил первый. ;-) По крайней мере, @Christoph сделал комментарий первым, хотя. –

+0

@R .. не проблема, мы были очень близки. – ouah

Смежные вопросы