Цена абстракции-2 (или все, что мама не рассказывала про C++)

Иногда за абстракцию приходится платить временем исполнения. А иногда – временем отладки!

Вопрос в копилку для собеседования на позицию C++ гуру: влияет ли шаблонность метода на видимость переменных?

Правильный ответ с точки зрения MSVC 2005…

…звучит так: еще как влияет, разносит на хер настройки for-scope для всего последующего кода.

[code lang="cpp"]
struct NetOutputBuffer_c
{
public:
bool SendInt ( int iValue ) { return SendT ( iValue ); }
template < typename T > bool SendT ( T tValue );
};

#pragma conform(forScope, show)

template < typename T > bool NetOutputBuffer_c::SendT ( T tValue )
{
return true;
}

#pragma conform(forScope, show)

int main ()
{
for ( int i=0; i<10; i++ );
i++;
return i;
}

Z:\work\tmp>cl forscope-fuckup.cpp
Setting environment for using Microsoft Visual Studio 2005 x86 tools.
forscope-fuckup.cpp
forscope-fuckup.cpp(8) : warning C4811: value of pragma conform(forScope, show) == true
forscope-fuckup.cpp(13) : warning C4811: value of pragma conform(forScope, show) == false
[/code]

Все догадываются, надеюсь, как и сколько можно отлаживать наведенный таким счастьем баг?

  • http://zeux.livejournal.com/ Zeux

    Ох ты нафиг…
    У меня был баг с forscope, я не разбирался в причинах, и тупо в PCH добавил #define for if (false) ; else for. Теперь ясно…

  • shodan

    Мне повезло: я отлаживал таки не видимость.

    Сделал cut-n-paste баг, использовал не ту переменную, словил ассерт.

    Немедленно исправил, но задумался: а почему это ее там вообще видно и код компилируется?

    И уже буквально через полчаса выяснилось вот такое чудо!!!

  • CEMEH

    Ну, это же не цена абстракции, это чиста баг.

  • shodan

    Баг в компиляторе – это цена за абстракцию, уплаченная временем отладки.