Анализируя некоторые исходные коды, я обнаружил следующие определения в одном файле (.c), а не в другом файле (это один из кодов в файле, созданном с помощью flex, и нет включенного файла (stdio .h, string.h, errno.h, stdlib.h, inttypes.h), который определяет yyin):
extern FILE *yyin, *yyout;
FILE *yyin = (FILE*) 0, *yyout = (FILE *) 0;
Я в принципе знаю, что означают эти утверждения.
Но ключевое слово extern используется для использования таких определений, как переменная и функция, которые находятся в другом файле. (Он не выделяет для этого память.)
Итак, я имею в виду, что код:
FILE *yyin = (FILE*) 0, *yyout = (FILE *) 0;
должен появиться в другом файле, а не в том же файле.
Например,
a.c
extern File *yyin; /* It means that a.c want to use yyin declared in b.c */
int main(void) {
yyin = *expressions*; /* yyin is variable in b.c */
return 0;
}
b.c
File *yyin = (FILE*) 0;
Почему они существуют в одном файле? Есть ли какие-то особые значения, когда ключевое слово extern и обычное объявление переменной с одним и тем же именем находятся в одном файле?
#include
, вы поймете, что для единицы перевода с определением нормально иметь также объявление extern. - person M.M   schedule 20.09.2017