Код, включающий компиляции domain_error без & lt; stdexcept & gt; header [duplicate]

Вы должны использовать Context.startInstrumentation , а не adb. Например, из вашей операции запустите

  startInstrumentation (новое имя компонента («com.example.aatg.tc.test», «android.test.InstrumentationTestRunner»), null, null);   

0
задан lorniper 26 February 2015 в 15:50
поделиться

2 ответа

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

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

4
ответ дан user2079303 16 August 2018 в 04:09
поделиться
  • 1
    Как и в качестве конкретного примера, последние несколько версий g ++ пытались удалить ненужные заголовки из стандартной библиотеки, чтобы ускорить компиляцию кода пользователя (так как все эти заголовки должны быть проанализированы), и я видел этот разрывный код, который был не включая достаточные заголовки. – Chris Jefferson 26 February 2015 в 16:13
  • 2
    если заголовок (A.h) содержит другие заголовки (B.h, C.h), то все содержимое будет видимым в .cpp-файлах, которые включают A.h, правильно? Это действительно странно, я могу использовать std :: vector & lt; double & gt; без указания включают & lt; vector & gt; ... – lorniper 26 February 2015 в 16:14
  • 3
    @lorniper да, ты прав. Это не очень странно, это просто означает, что один из включенных заголовков в настоящее время включает <vector>. – user2079303 26 February 2015 в 16:20

В стандарте C ++ сказано следующее в разделе 17.6.5.2 [res.on.headers]:

Заголовок C ++ может содержать другие заголовки C ++.

Для вашего вопроса это означает, что компилятор может просто действовать так, как если бы вы включили другие заголовки C ++. В вашем примере компилятору разрешено включать заголовок <numeric>, если вы включили <algorithm> или наоборот.

Но это еще не все. В стандарте также говорится:

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

И:

Стандартные заголовки C [...] должны включать только соответствующий стандартный заголовок C ++ [...]

(Обратите внимание, что я цитирую последний бесплатный проект C ++ 11. Окончательная версия стандарта ISO не является бесплатной. См. https://isocpp.org/std/the-standard .)

Заголовок <utility> является примером заголовка C ++, который, как гарантируется, будет содержать другой. Его синопсис explitly включает <initializer_list>. Это означает, что соответствующий компилятор должен принять следующее:

#include <utility>
// #include <initializer_list> // not needed

int main()
{
    std::initializer_list<int> x = {};
}

Для заголовков C, напротив, это означает, что следующее не должно компилироваться:

#include <stdio.h>

int main()
{
    std::cout << "\n"; // must not compile
}

Что означает стандарт говорит, что это подтверждается документацией вашей реализации. Например, в документации для Visual C ++ 2013 говорится:

Заголовок библиотеки C ++ включает любые другие заголовки библиотек C ++, необходимые для определения необходимых типов. (Всегда указывайте явно любые заголовки библиотек C ++, необходимые в блоке трансляции, однако, чтобы вы не ошиблись в отношении его фактических зависимостей.) Стандартный заголовок C никогда не включает другой стандартный заголовок.

вот хороший; не зависят от автоматического включения. Явно укажите все, что вам нужно.

0
ответ дан Christian Hackl 16 August 2018 в 04:09
поделиться
Другие вопросы по тегам:

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