Для простоты возьмите этот бит бесполезного кода. Если я попытаюсь скомпилировать приведенный ниже фрагмент кода с помощью clang, я получаю следующее сообщение об ошибке: argc_test.c: 5: 14: ошибка: сравнение между указателем и целым числом ('char **' и 'int') [-Werror ], если (! ARGC = 4)Пропуски «argc» как «argv» приводят к сравнению между char ** и int - почему?
код:.
#include <stdio.h>
#include <stdlib.h>
int main(int agrc, char *argv[]){
if (argc != 4){
fprintf(stderr, "Incorrect usage.");
}
}
Я знаю, что ошибка вызвана опечатка в строке 5 (объявляя переменную "AGRC" вместо "ARGC" То, что я хочу знать, почему это приводит к сравнению char ** и int в выражении if? Означает ли это, что argc является символом char **, хотя я еще не объявил его?
Это wasn 't t он только сообщение об ошибке, которое я получил, это только тот, который выделялся. Вот полный выход из командной строки:
~/workspace/week_4/pset_4/resize/ $ make argc_test
clang -fsanitize=integer -fsanitize=undefined -ggdb3 -O0 -std=c11 -Wall -Werror -Wextra -Wno-sign-compare -Wshadow argc_test.c -lcrypt -lcs50 -lm -o argc_test
argc_test.c:5:9: error: use of undeclared identifier 'argc'; did you mean 'argv'?
if (argc != 4){
^~~~
argv
argc_test.c:4:26: note: 'argv' declared here
int main(int agrc, char *argv[]){
^
argc_test.c:5:14: error: comparison between pointer and integer ('char **' and 'int') [-Werror]
if (argc != 4){
~~~~^~
argc_test.c:4:14: error: unused parameter 'agrc' [-Werror,-Wunused-parameter]
int main(int agrc, char *argv[]){
^
3 errors generated.
make: *** [argc_test] Error 1
только первая ошибка. Другие сообщения являются фиктивными, потому что компилятор делает некоторые недопустимые догадки, чтобы попытаться пройти мимо первой ошибки. –
Когда он спрашивает, имею ли я значение «argv», то, что его способ сказать, что он предположил, что я имел в виду, рассматривал его как таковой и возникла ошибка? Аналогично тому, когда google переинтерпретирует опечатку и предоставляет результаты поиска, предполагая, что вы имели в виду что-то еще? –