2015-12-22 4 views
-2

Почему структуры должны быть определены за пределами основной функции, чтобы другие функции могли их получать? Я понял this answer, но почему обычные переменные, объявленные в основной функции (например, int и float), могут использоваться как аргументы для функции, но не структуры, определенные в main?Передача структур против передачи переменных в функцию в C

(PS: Я задал этот вопрос, потому что я до сих пор не хватает репутации комментировать)

+0

Когда вы говорите «структура», вы говорите о типе (определенном с помощью 'struct thingy {... stuff ...};'), или вы говорите о переменных с этим типом (определяется с помощью 'struct thingy myThingy;??) – immibis

+0

Я имею в виду функции, которые получают экземпляры структуры - то есть переменные с этим типом. – Leponzo

+0

так «почему вы не можете передавать переменные, определенные в' main', другим функциям, если у них есть тип структуры? »? Ответ на это вы можете! – immibis

ответ

2

Одно слово: «Сфера».

Если тип вашей структуры определен в main(), то область видимости этого типа равна main. Ничто за пределами main не может знать об этом. Если вы хотите передать его другой функции, очевидно, что функция должна знать тип, но если тип известен только в main, то, очевидно, функция не может знать об этом.

Решение? Переместите область типа туда, где ее видят как основная, так и функция «получение».

Редактировать: встроенные типы, такие как int, char и т. Д. Уже имеют глобальный охват и поэтому известны повсюду. Здесь мы имеем дело с типом определения пользователя, объем которого ограничен в зависимости от того, где он определен.

Те же правила применяются к переменным (или экземплярам типа) - глобальная переменная видна в любом месте (я знаю, вы можете «скрыть ее» локальным с тем же именем - позволяет не разделить волосы; , но локальная переменная в main() видна только внутри main().

+0

Да, но я хотел знать, почему это работает для обычных переменных, определенных в основном (например, int x).Разве их рамки не должны ограничиваться только основной? – Leponzo

+0

Короткие ответы нет: смотрите на редактирование. – John3136

+0

Причина, по которой она работает, заключается в том, что другие типы _intrinsic_, такие как: char, short, int, long, double, ... ', поэтому все знают о них –

0

Вы должны понимать понятия scope и примитивные типы данных. Структуры - это не примитивные типы, а определенные пользователем конструкции, поэтому, если вы определяете структуру в заданной области, она не будет известна программе вне этой области, потому что именно вы определили ее, поэтому она ограничена областью, в которой вы делали определите его. Primitive data types like (int, float, char), определенные на языке и известные всей программе. Если бы они не были доступны во всем мире, это будет фактически невозможно определить main() сам, так как

int main(void) 
{ 
    return 0; 
} 

Это простое определение main() требуется int быть «определен» уже.

Наконец, чтобы иметь возможность определять структуры, вам также нужны эти примитивные типы, поскольку вы определяете структуру как объект, содержащий один или несколько из этих примитивов. Конечно, вы можете использовать ранее определенные структуры в качестве элементов структуры и так далее.

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