Вопрос: Это я, или G CC и Clang имеют не совсем правильные сообщения об ошибках при оценке конкретных глобальных объявлений char в C?
--- И особое примечание относительно Аналогичный вопрос заключается в том, что я ищу разъяснения относительно того, почему объявление char вызывает такую реакцию. Да, есть связанные вопросы, но все, что я видел, это объявления int.
$ g cc --version g cc (Ubuntu 9.3.0-10ubuntu2) 9.3.0
$ clang --version clang version 10.0.0-4ubuntu1
Рассмотрим следующий C код, в состоянии. c:
#include <stdio.h>
char able;
able = 'X';
int main(void)
{
printf("%c", able);
}
Первое замечание: да, объединение объявление и инициализация способности намного эффективнее. Однако при запуске через G CC и Clang появляющиеся сообщения об ошибках кажутся мне, в основном, неправильными сообщениями:
$ clang -Weverything able.c
able.c:5:1: warning: type specifier missing, defaults to 'int' [-Wimplicit-int]
able = 'X';
^
able.c:5:1: error: redefinition of 'able' with a different type: 'int' vs 'char'
able.c:3:6: note: previous definition is here
char able;
^
able.c:3:6: warning: no previous extern declaration for non-static variable 'able' [-Wmissing-variable-declarations]
char able;
^
able.c:3:1: note: declare 'static' if the variable is not intended to be used outside of this translation unit
char able;
^
2 warnings and 1 error generated.
$ gcc -Wall -Wextra -Wpedantic able.c
able.c:5:1: warning: data definition has no type or storage class
5 | able = 'X';
| ^~~~
able.c:5:1: warning: type defaults to ‘int’ in declaration of ‘able’ [-Wimplicit-int]
able.c:5:1: error: conflicting types for ‘able’
able.c:3:6: note: previous declaration of ‘able’ was here
3 | char able;
| ^~~~
Оба набора сообщений жалуются на отсутствие типа спецификатор, за исключением того, что спецификатор типа --- char --- действительно здесь. Когда сообщения объявления и инициализации объединяются в этом месте, над / перед основной функцией, программа компилируется. Когда пара сообщений помещается в основную функцию, даже без объединения, программа также компилируется.
Итак, оператор charable; вполне подходит, так почему же эти сообщения об ошибках?