2017-01-21 9 views
1

Для простоты возьмите этот бит бесполезного кода. Если я попытаюсь скомпилировать приведенный ниже фрагмент кода с помощью 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 
+1

только первая ошибка. Другие сообщения являются фиктивными, потому что компилятор делает некоторые недопустимые догадки, чтобы попытаться пройти мимо первой ошибки. –

+0

Когда он спрашивает, имею ли я значение «argv», то, что его способ сказать, что он предположил, что я имел в виду, рассматривал его как таковой и возникла ошибка? Аналогично тому, когда google переинтерпретирует опечатку и предоставляет результаты поиска, предполагая, что вы имели в виду что-то еще? –

ответ

0

Кажется, что argc является автоматически корректируется до argv при лязг встречает ошибку

argc_test.c:5:9: error: use of undeclared identifier 'argc'; did you mean 'argv'? 

И, конечно, если сравнивать argv к 4, вы сравниваете указатель на целое число.

Этот вид автокоррекции называется «исправлять намеки», см. https://clang.llvm.org/diagnostics.html.

+0

Нет «автокорректированных», имена произвольны, это фактическое определение, если аргументы в вызываемой функции «main» в этом случае имеют значение, – zaph

0

INT основной (интермедиат AGRC, символ * ARGV [])

ошибка объявляя ARGC целое - вы назвали его AGRC. Я полагаю, именно поэтому clang не понимает этого.

+0

Спасибо за ответ, но я знаю о опечатка, я указал на это в оригинальном посте. Я хотел знать, как опечатка привела к сравнению целого числа с char **. –