3

В Dlang documentation состояния:Почему я не могу получить ошибки компилятора для неиспользуемых локальных переменных?

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

Я составил следующий код в ldc 0.14, gdc 5.1 и dmd 2.067.1:

void main() 
{ 
    int i; 
    //local variable i not used... 
} 

я не получил каких-либо ошибок компилятора. Если это не скомпилируется?

ответ

3

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

Ошибка использования локальной переменной без предварительного присвоения ей значения. Реализация не всегда может обнаружить эти случаи. Другие компиляторы языка иногда выдают предупреждение для этого, но поскольку он всегда является ошибкой, это должно быть ошибка.

Это не реализовано и, вероятно, никогда не будет, поскольку люди зависят от автоматической инициализации как функции.

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

Не реализовано

Это ошибка вернуть адрес или ссылку на локальную переменную.

Только частично реализовано.

+0

«Ошибка использования локальной переменной без предварительного присваивания ей значения»: вы правы, это не имеет никакого смысла для инициализированных переменных по умолчанию. Я думаю, что единственным случаем, когда компилятор мог ошибиться, является то, что вы явно инициализировали переменную '= void' перед ее чтением. – jpf

+1

Ну, инициализация по умолчанию предназначена для того, чтобы помочь поймать неинициализированные ошибки переменных! Вот почему по умолчанию значение char не равно нулю, а скорее недействительным модулем кода utf-8. Вот почему плавает по умолчанию значение NaN, поэтому их использование становится очевидным. Но нет никакого NaN или null для int ... он просто становится 0, что на самом деле очень полезно, поэтому теперь люди зависят от него как функция удобства, а не функция обнаружения ошибок! –

+0

Что сказал Адам. Это также помогает быстрее писать определенный код, например, объявлять переменную перед областью. Вам не нужно будет устанавливать для него значение по умолчанию, которое, в любом случае, будет переопределено. скажем, в статическом цикле. Большинство компиляторов, которые обнаруживают неинициализированные переменные ex.компилятор C# не обнаружит этого ex. цикл всегда будет выполняться. – Bauss

2

Я никогда не видел компилятора, который генерирует ошибку для неиспользуемой переменной. Предупреждения наверняка, но ошибки нет.

Я предлагаю вам попробовать Dscanner, который их обнаруживает, хотя он иногда дает неправильное предупреждение, особенно если он используется как параметр out.

+0

Я не верю никаким компиляторам D, но компиляторы для других языков, например. C#. – Bauss