2015-10-19 6 views
1

У меня есть сомнения относительно инициализаторов C. Если пользователь инициализатор как:C инициализаторы во время выполнения

int a[2] = {1, 3}; 

в статической переменной памяти, я понимаю (думаю), что компилятор помещает эти данные автоматически в .data эльфа файла. Но когда мы делаем это внутри функции, чтобы инициализировать переменную, которая будет в стеке, что происходит? Компилятор генерирует код, который «заполняет» эту переменную во время выполнения? Если да, то почему мы не можем сделать что-то вроде:

struct mystruct { 
    int x; 
    int y; 
}; 

int main(){ 

    struct mystruct foo; 
    foo = {1, 2}; 

    return 0; 
} 
+0

Потому что вы можете завершить 'main' с'; ':-) – ameyCU

+2

_Des компилятор сгенерировать код, который« заполняет »эту переменную во время выполнения? _ Почему бы вам не спросить у своего компилятора, что это делает? Скомпилируйте простую функцию и посмотрите на сборку, которую генерирует ваш компилятор. – mah

+0

@ameyCU Нет, вы не можете. :-) – Downvoter

ответ

-1

вам нужно различать код, который функционально отличается и код, который синтаксически отличается. Компиляторы и разработчики языка и авторы сначала фокусируются на предоставлении функций, таких как статические данные, а также локальные (стек), ...

Второе соображение - это «синтаксический сахар», который является упрощенным синтаксисом для выполнения чего-то, что уже можно сделать

в вашем примере

struct mystruct foo; 
    foo = {1, 2}; 

такая же, как

struct mystruct foo; 
    foo.x = 1; 
    foo.y = 2; 

вы можете утверждать, что первый из них проще и понятнее, б ut, очевидно, недостаточно распространен. Обратите внимание, что один язык изменил синтаксис. C++ изменил пример

mystruct foo; 
    foo.x = 1; 
    foo.y = 2; 

, потому что это было так принято, что определение типа во структуры с ++ решили сделать и типы структур классов автоматически.

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

2

Это просто вопрос синтаксиса.

С C99, вы можете сделать именно это, но вам нужно явное приведение, чтобы сказать компилятору, что {...} блок, который следует есть:

foo = (struct mystruct){1, 2}; 

Обратите внимание, что выше является назначение, а не инициализация. Таким образом, также следующее юридическое:

for (int i = 0; i < 10; ++i) { 
    foo = (struct mystruct){i, 2*i}; 
    // Do something with foo 
} 
Смежные вопросы