Вы должны заставить main()
соответствовать требованиям стандарта, и вы должны напечатать глобальный F
, а также аргумент F
:
#include <stdio.h>
int F;
int main(int F, char **G)
{
printf("F is %d\n", F);
{
extern int F;
printf("%s: F is %d\n", G[0], F);
}
return 0;
}
При компиляции (из исходного файлаquirky43.c
для программирования quirky43
) и запуска, я получаю:
$ gcc -O3 -g -std=c11 -Wall -Wextra -Werror quirky43.c -o quirky43
$ ./quirky43
F is 1
quirky43: F is 0
$ ./quirky43 this is why you get command line arguments
F is 9
quirky43: F is 0
$
Первый printf()
выводит первый аргумент в main()
(условно называемый argc
, но в этом нет ничего плохогос вызовом F
за исключением того, что это неожиданно).Второй выводит глобальную переменную F
(а также имя программы, условно argv[0]
, но опять-таки нет ничего плохого в использовании G
, за исключением того, что это неожиданно).extern int F;
внутри набора фигурных скобок означает, что F
в этом блоке операторов относится к переменной F
, определенной за пределами охватывающей области, что означает переменную области действия файла F
- что, как можно заметить, является правильныминициализируется до 0
.1
появляется потому, что вы вызвали программу без аргументов, а количество аргументов включает в себя имя программы.По этой же причине напечатанное значение было 9
, когда в командную строку было добавлено 8 аргументов.
Обратите внимание, что другой хороший вариант компиляции - -Wshadow
:
$ gcc -O3 -g -std=c11 -Wall -Wextra -Werror -Wshadow quirky43.c -o quirky43
quirky43.c: In function ‘main’:
quirky43.c:6:14: error: declaration of ‘F’ shadows a global declaration [-Werror=shadow]
int main(int F, char **G)
~~~~^
quirky43.c:4:5: note: shadowed declaration is here
int F;
^
cc1: all warnings being treated as errors
$
(Компиляцияс GCC 8.1.0 на Mac под управлением macOS High Sierra 10.13.5.)