Простая программа:
int main()
{
long i = i;
return 0;
}
Компиляция в виде C не дает ошибок и предупреждений.
$ gcc -Wall -Wextra -pedantic 1.c
Компиляция в качестве C++ дает предупреждение:
$ c++ -Wall -Wextra -pedantic 1.c
1.c: In function ‘int main():
1.c:3:7: warning: ‘i is used uninitialized in this function [-Wuninitialized]
long i = i;
В обоих случаях переменная я кажется 0, хотя в C++ она может быть неинициализирована. Я действительно сделал такую опечатку в одной из моих функций, и ее было довольно сложно найти. Что я могу сделать, чтобы этого избежать? Я бы ожидал хотя бы предупреждения. Более того, Clang не дает никаких предупреждений в любом случае (c или C++). Есть ли определенная часть стандарта, которая говорит что-нибудь об этом поведении?
Изменение: попробовав что-то похожее:
$ cat 1.c
int main(void)
{
int k = k + 0;
int i = i + 1;
return 0;
}
Предупреждение (в C) генерируется только для "i".
$ gcc -Wall -Wextra 1.c
1.c: In function ‘main:
1.c:4:6: warning: ‘i is used uninitialized in this function [-Wuninitialized]
int i = i + 1;