Есть ли способ отключить глобальные идентификаторы в заголовках C? - PullRequest
1 голос
/ 09 ноября 2011

В GCC мне разрешено делать это:

#include <cstdio>

int main() {
  printf("foo");
  std::printf("bar"); // "correct" way
}

Есть ли способ получить сообщение об ошибке / предупреждение при первой попытке?

Ответы [ 3 ]

1 голос
/ 09 ноября 2011

Нет, вот как cstdio должен работать.Делать так, как вы хотите, было бы против стандарта.

Довольно сложно утверждать, что std::printf является правильным в C ++.Использование std::cout - это правильный способ сделать это.

Обновление Как указывают другие, стандарт только предписывает, что функции объявлены в пространстве имен std.Реализациям разрешается дополнительно определять их в глобальном пространстве имен.

0 голосов
/ 09 ноября 2011

Поскольку вы написали программу NO, вы не можете получить предупреждение / ошибку, потому что cstdio должен предоставить std :: printf, чтобы его можно было использовать БЕЗ квалификатора пространства имен. Он имеет директивы using, определенные специально, чтобы разрешить использование функций пространства имен std :: name без генерации ошибки.

В частности cstdio содержит:

namespace std
{
  using ::FILE;
  using ::fpos_t;

  using ::clearerr;
  using ::fclose;
 ...
}

Обратите внимание, что это является частью стандартного ... cstdio ПРЕДЛАГАЕТСЯ действовать таким образом.

0 голосов
/ 09 ноября 2011

printf - это extern "C" функция из <stdio.h> (стандартный заголовочный файл C), которая включена из <cstdio>, но std::printf - это C ++. И вывод C ++ обычно лучше сделать для std::cout, используя стандартный класс C ++ std::ostream. Я не знаю, как получить предупреждение при использовании <stdio.h> функций, но если это действительно важно для вас, вы можете подумать о настройке вашего компилятора GCC, например, GCC MELT расширение. Для настройки GCC может потребоваться неделя или больше усилий для человека, который никогда не делал этого раньше (поскольку вам необходимо понять некоторые из внутренних представлений GCC).

...