yuri.nefe...@gmail.com writes: > > В С нет разницы между void f(struct S a[]) и void f(struct S *a) > - компилятору это всё равно. > > Моё беспокойство было, как будет обрабатываться a[i] или, что то же > самое *(a+i). Как компилятор предотвратит использование такой > конструкции?
Если Вы хотите определить в своей программе функцию f, которая принимает массив декларированных, но не определённых структур S, то имейте в виду, что передавать надо массив указателей на структуры. То есть должно быть f(struct S **a). Вы можете оперировать только интерфейсами структуры, которые описаны определены в том же файле, что и сама структура, и которые принимают в качестве параметра указатели на структуру struct S. Если Вы беспокоитесь по поводу того, как же быть с функцией, которая объявлена в таком виде в заголовочном файле то тут беспокоиться не надо. Её реализация будет скомпилирована в свой отдельный объектник из файла с исходниками этих функций, где в частности будет и определение структуры. Потом этот объектник будет слинкован в динамическую библиотеку, и когда Ваша программа будет пользоваться данной библиотекой, то функции этой библиотеки всегда будут "знать" размер struct S. Так проще стало?
pgpVsUssI7Qvw.pgp
Description: PGP signature