Могу ли я избежать включения <iostream>, если я не использую его функции? - PullRequest
0 голосов
/ 29 января 2019

Я хотел бы оптимизировать этот код:

#include <iostream>

#define LOG if(true) {} else std::cerr

LOG << "test" << std::endl;

Поскольку компилятор не игнорирует блок else и требует включения <iostream>, могу ли я использовать «более дешевую» функцию по сравнению с std::cerr, включая более простой заголовок по сравнению с <iostream>?

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Можно ли не включать, если я не использую его функции?

Нет.Не использовать функции недостаточно.

Кроме того, не используя функции, вы также не должны использовать другие объявления, такие как переменные (например, std::cerr), шаблоны и типы.Кроме того, «использование» в этом контексте означает любое упоминание объявленных идентификаторов - то, что конкретная ветвь не будет взята во время выполнения, не означает, что код не должен быть правильно сформирован.Несколько шаблонов объявлены в <iosfwd> и поэтому могут использоваться ограниченным образом без включения их определения.

Я хотел бы оптимизировать этот код:

Ваша программане имеет поведения во время выполнения, поэтому вы можете оптимизировать его до:

// nothing
0 голосов
/ 29 января 2019

Как насчет этого?

#ifdef DO_LOG
    #include <iostream>
    #define LOG std::cerr
#else
    class nullstr {};
    template<typename T>
    nullstr operator<<(nullstr s, T const&) { return s; }

    #define LOG if (false) nullstr()
#endif

Код в if будет скомпилирован, но не выполнен.

Этот "нулевой поток" довольно плохо реализован, хотя, с несколькими проблемами (например, не могу использовать std::endl).В Boost есть гораздо лучшая реализация, но я сомневаюсь, что использование Boost для такой простой функции имеет смысл.

...