понедельник, 2 марта 2009 г.

Давно про компилятор не писал

Давно про компилятор не писал, который в состав Visual Studio входит. Но там все идет как и раньше. Я уже не обращаю внимания на то, что компилится код вроде такого:
#include <stdio.h>
int main()
{
int x = (enum Fff)1;
enum Fff { dx, dy };
return 0;
}
В GCC выдется ошибка, но мистер Кейвс (Jonathan Caves) из Visual C++ Compiler Team весьма нервно отнесся к моим аппеляциям к GCC при демонстрации того, что в VC++ ошибка и как все должно работать, поэтому я уже не отсылаю такого рода репорты.

А вот код вроде того, что приведен ниже, уже вызывает интерес, хотя формально и не имеет ошибок:
class MyClass
{
public:
MyClass() {};
MyClass( int ) {};
};

int main()
{
MyClass (x);
MyClass (0);
return 0;
}
Получилось что-то вроде этого в результате опечатки — хотелось объявить переменную x и инициализировать её чем-то. Почему это скомпилировалось вообще? Коллега предположил, что должен вызываться конструктор MyClass и инициализироваться x-ом, однако, это не так. Это все то же объявление переменной x. Мне тут хотелось бы получать предупреждение на этапе компиляции, потому что я так и не придумал зачем может понадобиться объявлять переменные в таком синтаксисе.

А настоящая программа скомпилировалась и упала в рантайме, ошибка была сразу найдена, но лучше до рантайма не доводить imho.

Кстати, как вызвать конструктор MyClass, создав объект на стеке? Во втором случае так и будет, но имеется ввиду без константы. Ну все так-же как обычно — MyClass (x)(y).

Вывод тут простой — не стоит так писать(с лишними скобками), поскольку путает других разработчиков. А разработчикам компилятора пора уже ввести Warning level 5 и выдавать там предупреждения на коде вроде такого.

Комментировать в ВКонтакте