Intereting Posts
Как мы можем анализировать поля заголовка HTTP-ответа, используя Qt / C ++? Сводка строки регулярного выражения C ++ Реализация алгоритма Дейкстры Почему я должен использовать адрес-оператор для получения указателя на функцию-член? вектор указателя на объект – как избежать утечки памяти? Существуют ли какие-либо варианты использования для classа, который можно копировать, но не перемещать? Как сделать C ++ cout не использовать научную нотацию увеличить asio для сервера синхронизации, поддерживая сеанс TCP (с помощью прото-буферов Google) Как загрузить текстуры JPG / PNG в SDL / OpenGL-приложении под OSX Qt в QTableView не скопируемые объекты и инициализация значения: g ++ vs msvc Возможно ли предотвратить множественное наследование определенных базовых classов во время компиляции? как const_cast (s), а s – строковый тип? Ошибка при попытке скомпилировать учебник регулярного выражения c ++ 11 с помощью Clang ++ в Linux Можно ли переопределить неатомную нагрузку после атомарной загрузки?

Это самоназвание делает что-то разумное?

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

char * acFilename = acFilename; 

EDIT: компилятор жалуется на предупреждение C4700, что я использую неинициализированную переменную.

В области блоков в C ++ это неопределенное поведение, так как правая часть считывает переменную переменную до ее инициализации (C ++ 14 [dcl.init] / 12).

В области блока в C11 это может быть либо неопределенным поведением, либо вести себя как неинициализированная переменная, в зависимости от различных деталей реализации и остальной функции, см. Здесь для подробного анализа.

В области пространства имен в C ++ он хорошо определен и имеет нулевой указатель. Это связано с тем, что все статические переменные инициализируются нулем до того, как будут рассмотрены их инициализаторы. (C ++ 14 [basic.start.init] / 2).

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

Этот код не имеет никакого смысла. Вероятно, это опечатка, может быть, кто-то хотел использовать

 char* acFilename = ::acFilename; 

или же

 char* acFilename = m_acFilename; 

или что-то другое.

Как бы то ни было, в лучшем случае это запутанно и бесполезно, вероятно, ошибка, потому что кто-то хотел использовать другую переменную.

Я видел это раньше. Поскольку gcc довольно запутанный, с его неинициализированными переменными предупреждениями, это трюк, чтобы заставить замолчать эти предупреждения. Не уверен, что это намеренный выбор дизайна gcc или компилятор, просто глупо, но я видел, как люди делают это специально, чтобы заставить gcc заткнуться (и в процессе нарушить предупреждение, которое может быть правильным в будущем).

Я бы просто заменил его инициализацией на NULL. Это плохая привычка, не работает на других компиляторах, и NULL не может быть менее корректным, чем неопределенное значение и неопределенное поведение.

Просто чтобы продемонстрировать, как это работает (а также потому, что я хотел знать, продолжают ли это делать новые версии gcc):

 $ cat foo.c int foobar(void) { int foo; return foo + foo; } $ cc -c -Wall -O2 foo.c foo.c: In function 'foobar': foo.c:6:13: warning: 'foo' is used uninitialized in this function [-Wuninitialized] return foo + foo; ~~~~^~~~~ $ ed foo.c [...] $ cc -c -Wall -O2 foo.c $ cat foo.c int foobar(void) { int foo = foo; return foo + foo; } $ cc -c -Wall -O2 foo.c $ cc -v [...] gcc version 6.2.0 20161005 (Ubuntu 6.2.0-5ubuntu12) $ 

В некоторых местах внутри программы может быть возможно, чтобы переменная находилась в одном из следующих условий:

  1. Входы, которые были получены, заставили переменную писать, а также заставят код использовать ее значение в будущем.

  2. Входы, которые были получены, заставили переменную не записываться, но также могут привести к тому, что код не будет использовать ее значение.

Некоторые компиляторы будут кричать, если они видят, что существуют входы, которые могут привести к тому, что переменная не будет записана, и существуют входы, которые заставили бы эту переменную читать. Даже если единственный вход, который заставит переменную читать, также заставит ее писать, компиляторы могут этого не осознавать. Хотя можно было бы отключить жалобы компилятора, безоговорочно инициализируя переменную, машинный код, который инициализирует переменную значением, которое никогда не может быть использовано, не будет служить никакой функциональной цели. Конструкция исходного кода, которая бы заглушала жалобы компилятора, но не приводила к компилятору, генерирующему бесполезный машинный код, может быть предпочтительнее того, который должен был бы генерировать бесполезный машинный код. В некоторых компиляторах такая цель может служить самоинициализирующей декларацией.

Если у типа есть ловушечные представления, нет никакой практической альтернативы написанию инициализации, что компилятор, скорее всего, превратится в бесполезный машинный код, но если у типа нет ловушек, нет никакой особой причины, почему качественный компилятор должен принуждать программистов просить бесполезный код, который они не хотят и не нуждаются. Однако, вместо того, чтобы пытаться иметь разные правила для платформ, где существуют различные типы и не имеют ловушечных представлений, авторы Стандарта отдают суждениям разработчиков о том, какое поведение будет разумным для конкретной целевой платформы и приложения поле.

Если на какой-то платформе компилятор не мог позволить программистам опустить инициализацию для переменных, которые копируются, но в противном случае не используются без необходимости генерации вероятных избыточных инициализаций, было бы разумно потребовать, чтобы программист включил инициализации во всех ситуациях, которые могли бы произойти , На другой платформе, где копирование бессмысленного значения просто приведет к тому, что место назначения будет иметь бессмысленное значение, однако, как правило, имеет смысл дать возможность программисту опустить инициализацию в случаях, когда ни одна из копий никогда не будет использована для любых реальных цель. Авторы Стандарта не прилагают никаких усилий, чтобы указать, что будет иметь смысл в любом конкретном случае, потому что они ожидают, что люди, пишущие реализации, должны быть способны судить.

Лучшим подходом для решения этой ситуации, вероятно, было бы написать макрос, который принимает переменную, а расширение будет инициализировать переменную до нуля (для реализаций, авторы которых считают, что есть больше значения, позволяющих компиляторам перескакивать rails, когда неинициализированная переменная копируется, даже если ни одна из копий действительно не используется для чего-либо, чем было бы гарантировано, что простой акт копирования переменной не будет иметь побочных эффектов) или ничего не делать (при использовании реализации, которая останется на рельсах даже без бесполезной инициализации).