Кто-нибудь когда-либо использовал макрос препроцессора __COUNTER__? - PullRequest
46 голосов
/ 17 марта 2009

Символ __COUNTER__ предоставляется VC ++ и GCC и дает возрастающее неотрицательное целое значение при каждом его использовании.

Мне интересно узнать, использовал ли кто-нибудь это когда-нибудь и стоит ли это стандартизировать?

Ответы [ 13 ]

0 голосов
/ 11 июня 2017

Использование в макросе TensorFlow's REGISTER_KERNEL_BUILDER . Каждый TensorFlow Op может иметь одно или несколько ядер в качестве своих реализаций. Эти ядра зарегистрированы у регистратора. Регистрация ядра выполняется путем определения глобальной переменной - конструктор переменной может выполнить регистрацию. Здесь авторы используют __COUNTER__, чтобы дать каждой глобальной переменной уникальное имя.

#define REGISTER_KERNEL_BUILDER(kernel_builder, ...) \
  REGISTER_KERNEL_BUILDER_UNIQ_HELPER(__COUNTER__, kernel_builder, __VA_ARGS__)

#define REGISTER_KERNEL_BUILDER_UNIQ_HELPER(ctr, kernel_builder, ...) \
  REGISTER_KERNEL_BUILDER_UNIQ(ctr, kernel_builder, __VA_ARGS__)

#define REGISTER_KERNEL_BUILDER_UNIQ(ctr, kernel_builder, ...)          \
  static ::tensorflow::kernel_factory::OpKernelRegistrar                \
  registrar__body__##ctr##__object(                                 \
      SHOULD_REGISTER_OP_KERNEL(#__VA_ARGS__)                       \
      ? ::tensorflow::register_kernel::kernel_builder.Build()   \
      : nullptr,                                                \
      #__VA_ARGS__, [](::tensorflow::OpKernelConstruction* context) \
            -> ::tensorflow::OpKernel* {                \
              return new __VA_ARGS__(context);          \
            });
0 голосов
/ 13 октября 2014

__COUNTER__ гарантированно будет уникальным в отличие от __LINE__. Некоторые компиляторы допускают сброс __LINE__. #include файлы также будут сброшены __LINE__.

0 голосов
/ 20 января 2013

Я намерен использовать __COUNTER__, чтобы дать каждому файлу в нашей кодовой базе уникальный идентификатор, чтобы этот уникальный код мог использоваться при регистрации ASSERT во встроенной системе.

Этот метод намного эффективнее, чем использование строк для хранения имен файлов (с использованием __FILE__), особенно во встроенной системе с крошечным ПЗУ. Я думал об этой идее, когда читал эту статью - Assert Yourself на Embedded.com. Жаль, что он работает только с компиляторами на основе GCC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...