Предлагается разработать безопасную альтернативу встроенного макроса __COUNTER__
. Первое вхождение макроса заменяется на 0
, второе на 1
, и так далее. Значение __COUNTER__
подставляется на этапе препроцессирования, следовательно его можно использовать в контексте constant expression.
К сожалению, макрос __COUNTER__
опасно использовать в заголовочных файлах — при другом порядке включения заголовочных файлов подставленные значения счетчика поменяются. Это может привести к ситуации, когда например в foo.cpp
значение константы AWESOME
равно 42, в то время как в bar.cpp
AWESOME≡33
. Это нарушение принципа one definition rule, что есть страшный криминал во вселенной C++.
Нужна возможность использовать локальные счетчики вместо единого глобального (как минимум, для каждого заголовочного файла свой). При этом возможность использовать значение счетчика в constant expression должна сохраниться.
По мотивам этого вопроса на Stack Overflow.
Читать полностью »