Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Почему компилятор не выдаёт варнинг?


Автор: ДокторТуамОсес 18.6.2009, 15:16
Код

float  DD                        ;
float  WW                        ;
float * float_WW = &WW            ; // Берём адрес WW но при этом WW остаётся не инициализированной
        
cout << " DD == " << DD << endl ; // warning C4700: local variable 'DD' used without having been initialized
cout << " WW == " << WW << endl ; // Нет почему-то варнинга,  что переменная WW юзается без инициализации



Нет почему-то варнинга,  что переменная WW юзается без инициализации

Автор: andrew_121 18.6.2009, 15:17
ДокторТуамОсес, Ну так правильно. Вы переменную не используете, а извлекаете ее адрес. А он на протяжении работы всей программы неизменен!

Добавлено через 5 минут и 25 секунд
Компилятор какой?

Автор: azesmcar 18.6.2009, 15:25
ДокторТуамОсес
Переменная могла быть инизиализирована через указатель float_WW, об этом компилятор не знает (теоретически он мог бы знать, но это было бы сложно).
если закомментарить эту строку
Код

float * float_WW = &WW            ; // Берём адрес WW но при этом WW остаётся не инициализированной

варнинг будет выдаваться. 
Посмотрим такой пример
Код

int a;
int& ra = a;
ra = 10;
std::cout << a;

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

Автор: andrew_121 18.6.2009, 15:29
azesmcar, Странно. Варнингов нигде нет!
Компилировал вот этим:
Код

Using built-in specs.
Target: mingw32
Configured with: ../gcc-4.4.0/configure --prefix=/mingw --build=mingw32 --enable
-languages=c,ada,c++,fortran,objc,obj-c++ --disable-nls --disable-win32-registry
 --disable-werror --enable-threads --disable-symvers --enable-cxx-flags='-fno-fu
nction-sections -fno-data-sections' --enable-fully-dynamic-string --enable-libgo
mp --enable-version-specific-runtime-libs --enable-sjlj-exceptions --with-pkgver
sion='TDM-1 mingw32' --with-bugurl=http://www.tdragon.net/recentgcc/bugs.php
Thread model: win32
gcc version 4.4.0 (TDM-1 mingw32)

Вот код:
Код


#include <iostream>

int main(int argc, const char** argv) {
    float  DD                        ;
    float  WW                        ;
    float * float_WW = &WW            ; // Берём адрес WW но при этом WW остаётся не инициализированной
        
    std::cout << " DD == " << DD << std::endl ; // warning C4700: local variable 'DD' used without having been initialized
    std::cout << " WW == " << WW << std::endl ; // Нет почему-то варнинга,  что переменная WW юзается без инициализации
    /*  */
    return 0;
}


Автор: azesmcar 18.6.2009, 15:31
Цитата(andrew_121 @  18.6.2009,  15:29 Найти цитируемый пост)
azesmcar, Странно. Варнингов нигде нет!

Цитата

gcc -Wall ...

Автор: andrew_121 18.6.2009, 15:34
azesmcar, Ах да) Вот:
Код

main.cpp: In function 'int main(int, const char**)':
main.cpp:7: warning: unused variable 'float_WW'
main.cpp:9: warning: 'DD' is used uninitialized in this function


Добавлено через 2 минуты и 13 секунд
И все равно странно...

Автор: azesmcar 18.6.2009, 15:37
Цитата(andrew_121 @  18.6.2009,  15:34 Найти цитируемый пост)
И все равно странно... 

что именно?

Автор: zim22 18.6.2009, 15:38
Цитата(ДокторТуамОсес @  18.6.2009,  15:16 Найти цитируемый пост)
Нет почему-то варнинга,  что переменная WW юзается без инициализации

warning есть.
http://codepad.org/rGg8yvyr

Автор: andrew_121 18.6.2009, 15:42
Цитата(azesmcar @  18.6.2009,  15:37 Найти цитируемый пост)
что именно? 

То что компилятор не определяет что переменная не была инициализирована ни по ссылке, ни по указателю на нее.

Добавлено через 6 минут и 44 секунды
zim22, А какой компилятор там используется?

Автор: ДокторТуамОсес 19.6.2009, 11:59
Цитата(andrew_121 @  18.6.2009,  15:17 Найти цитируемый пост)
Компилятор какой?

MS VC++ 6.0


Цитата(andrew_121 @  18.6.2009,  15:17 Найти цитируемый пост)
ДокторТуамОсес, Ну так правильно. Вы переменную не используете, а извлекаете ее адрес. А он на протяжении работы всей программы неизменен!

И? smile  Что из этого следует, что адрес не изменен? smile 


Цитата(azesmcar @  18.6.2009,  15:25 Найти цитируемый пост)
ДокторТуамОсес
Переменная могла быть инизиализирована через указатель float_WW, об этом компилятор не знает

А почему он не знает? Я же нигде указатель не использовал в коде.

А компилятор не ругается, что:

Цитата(andrew_121 @  18.6.2009,  15:42 Найти цитируемый пост)
переменная не была инициализирована ни по ссылке, ни по указателю на нее


Автор: zim22 19.6.2009, 12:01
Цитата(andrew_121 @  18.6.2009,  15:42 Найти цитируемый пост)
А какой компилятор там используется?

gcc

Автор: ДокторТуамОсес 19.6.2009, 12:14
zim22, 
Классный On-line компилятор Вы показали. Буду им пользоваться в спорных случаях

Автор: zim22 19.6.2009, 12:38
Цитата(ДокторТуамОсес @  19.6.2009,  12:14 Найти цитируемый пост)
Классный On-line компилятор Вы показали

у меня в подписи ещё и "интеграл" есть smile

Автор: andrew_121 19.6.2009, 15:17
Цитата(zim22 @  19.6.2009,  12:38 Найти цитируемый пост)
 меня в подписи ещё и "интеграл" есть

Ну да...это саммое важное smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)