Почему компилятор C Microsoft хочет переменные в начале функции?

Поскольку функция getValues возвращает обещание, вам необходимо await получить функцию getValues, а вызвать ее .

Измените getValues следующим образом -

function getValues(collectionName, docName,) {
  console.log("start")
  var result;
  return db.collection(collectionName).doc(docName).get()
    .then(function (doc) {
      if (doc.exists) {
        console.log("Document data:", doc.data());
        result = doc.data().text;
        console.log(result);
        return result;
      } else {
        // doc.data() will be undefined in this case
        console.log("No such document!");
        result = "No such document!";
        return result;
      }
    }).catch (function (err) {
      console.log('Error getting documents', err);
    });
  };

Затем используйте getValues следующим образом -

[111 ]

Объяснение -

async, await - просто синтаксический сахар для Обещаний. Асинхронные функции возвращают обещание (или AsyncFunction более точно), которое необходимо разрешить, чтобы использовать его вложенное значение.

См. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

.

7
задан Jonathan Leffler 1 April 2009 в 14:05
поделиться

10 ответов

Похоже, что это использует стандарт C89, который требует, чтобы все переменные были объявлены перед любым кодом. Можно инициализировать их с литералами, и т.д., но не смешать код и переменные.

Должен быть флаг компилятора для включения C99 где-нибудь, который получит Вас поведение, к которому Вы привыкли.

Править: быстрый поиск с помощью Google не выглядит многообещающим для включения C99. Вам, вероятно, придется жить с C89 (который не так плох), или найдите лучший компилятор C (который был бы лучше).

34
ответ дан 6 December 2019 в 04:49
поделиться

Компилятор Microsoft C является C89 compilant и больше не обновляется, стандартный C99 не является запланированным afaik. Для плоскости C в C99 (переменные не на начинаются блока) используют другой компилятор или расширение C++.

7
ответ дан 6 December 2019 в 04:49
поделиться

Как другие сказали, это - просто версия C, который поддерживает MSC. Однако, если Вы готовы оскорбить пуристов, можно просто вынудить компилятор скомпилировать как C++.

Это будет иметь очень мало значения к чистому C (существуют некоторые правила о кастинге пусто* указатели и называют изменения художественного оформления), но мог бы дать Вам полезный гибрид. Сгенерированный код будет почти таким же - нет никакой волшебной потери (или усиление) эффективности путем внесения этого изменения.

Вы не говорите, почему Вы стремитесь использовать C.

3
ответ дан 6 December 2019 в 04:49
поделиться

В C90 все переменные должны быть объявлены перед первым оператором. Дело обстоит не так в C99. Я предполагаю, что Вы видите, имеет ли компилятор переключатель для C99.

1
ответ дан 6 December 2019 в 04:49
поделиться

Я не знаю для C99, но для более ранних версий локальных переменных языка должен быть объявлен в начале {} блок.

2
ответ дан 6 December 2019 в 04:49
поделиться

Согласитесь с комментарием о спецификации C. Помните, что C был создан во время, когда компьютеры не имели большой памяти.

Один способ иметь дело с этим состоял в том, чтобы удостовериться, что исходный файл мог быть считан в единственной передаче сверху донизу (который является также причиной, почему .h-файлы используются-> они говорят коду, что определенные функции действительно существуют, но возможно где-нибудь после в первый раз, когда на них ссылаются).

Вероятно, легче создать компилятор для кода, который объявляет переменные во главе объема, чем это для кода, который может объявить переменные где угодно.

1
ответ дан 6 December 2019 в 04:49
поделиться

Это помогает перевести в блок. Все переменные продвинуты на стек при вводе функции таким образом, Вы не должны волноваться о выполнении его больше нигде.

1
ответ дан 6 December 2019 в 04:49
поделиться

Стандарт C89, который необходимо использовать на основе этой ошибки, требует, чтобы переменные были объявлены, прежде чем Вы начнете выполнять операторы в любом блоке.

У Вас не будет этой проблемы с .cpp дополнительными файлами, потому что компилятор будет рассматривать их как файлы C++, который не имеет того же ограничения.

Ваш оператор контроля является кодом, таким образом, Вы не можете объявить переменную после этого (в том же блоке/объеме).

Технически Вы могли сделать это:

int foo(int x) {
    assert(x != 0);
    {
        int y = 2 * x;
        return y;
    }
}

но я не советовал бы ему.

1
ответ дан 6 December 2019 в 04:49
поделиться

Это - позор, что MS не реализует смешанные объявления и операторы как расширение компилятора C (даже если это прочь по умолчанию и должно быть включено). Я не уверен, но я думаю, что это - довольно общее расширение в других non-C99 компиляторах C; это походит достаточно часто, что я должен согласовать источник и образцы для компиляции в MSVC.

Я думал бы, что будет относительно легко реализовать, так как, конечно, они уже делают это для C++.

1
ответ дан 6 December 2019 в 04:49
поделиться

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

0
ответ дан 6 December 2019 в 04:49
поделиться