Решите, что существование времени компиляции включает файлы в C++

При передаче MetadataChanges в запрос addSnapshotListener (MetadataChanges metadataChanges, слушатель EventListener) метод:

Указывает, изменяются ли только метаданные (т.е. только Query.getMetadata () изменен) должен вызывать события снимка.

blockquote>

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

Я хочу знать, как я могу прослушать объект msg, который находится в локальном кэше

blockquote>

В этом случае вам следует рассмотреть возможность использования функции SnapshotMetadata isFromCache () [116 ] метод:

Log.d(TAG, "isFromCache: " + documentSnapshot.getMetadata().isFromCache());

Когда я в сети, он печатает:

isFromCache: false

Когда я в автономном режиме, он печатает:

isFromCache: true

5
задан Brian Tompsett - 汤莱恩 5 June 2016 в 13:33
поделиться

4 ответа

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

Они работают, генерируя другой файл заголовка с директивами #define , которые указывают на наличие заголовков / библиотек, которые вы хотите использовать.

10
ответ дан 18 December 2019 в 07:55
поделиться

Обновление для этой темы в случае, если у Вас недавно есть эта проблема: Теперь это возможно с C++ 17, используйте макрос препроцессора __ has_include ()

#if __has_include("MyInclude")
#  include "MyInclude"
#  define MY_INCLUDE 1
#else
#  define MY_INCLUDE 0
#endif

детали здесь:

https://en.cppreference.com/w/cpp/preprocessor/include

0
ответ дан 18 December 2019 в 07:55
поделиться

Вы не можете этого сделать. Фаза предварительной обработки C ++ происходит перед фазой компиляции, поэтому условные конструкции языка C ++ не могут быть полезны для размещения вокруг директив препроцессора, таких как #include.

Если вам нужна условная компиляция, то способ сделать это - использовать #ifdef. Что-то вроде:

#ifdef BOOST_BUILD
  #include "somebooststuff.h"
  using namespace boost;
#else
  #include "somestdstuff.h"
  using namespace std;
#endif

где BOOST_BUILD - это символ препроцессора, который вы определяете в своем make-файле или в другом месте.

6
ответ дан 18 December 2019 в 07:55
поделиться

Вы можете использовать __ cplusplus макрос, чтобы узнать, с какой версией C ++ вы работаете, в следующем стандарте (C ++ 1x, C ++ 0x не должен быть ) он будет иметь a значение больше 199711L

#if __cplusplus > 199711
    using std::regex;
#else
    using std::tr1::regex;
#endif
4
ответ дан 18 December 2019 в 07:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: