2017-01-21 29 views
1

为了简单起见,请使用这些无用的代码。如果我尝试使用clang编译下面的代码片段,我会得到以下错误消息: argc_test.c:5:14:错误:指针和整数之间的比较('char **'和'int')[-Werror ]如果(!的argc = 4)作为“argv”的拼写错误“argc”导致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 **,即使我没有声明它?

那没有'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'时,它是如何表达它的假设,我的意思是,对待它,并且遇到错误?类似于谷歌重新解释拼写错误并提供搜索结果,假设你的意思是别的吗? –

回答

0

看来,argc是当铛遇到错误

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

当然,如果你比较argv4,您比较一个自动更正为argv指向一个整数的指针。

这种自动更正称为“修复它提示”,请参阅https://clang.llvm.org/diagnostics.html

+0

没有“自动更正”,名称是任意的,它是实际的定义,如果被调用函数中的参数,在这种情况下,“主要”, – zaph

0

INT主(INT agrc,焦炭*的argv [])

错误声明ARGC整数 - 你把它叫做AGRC。 我想这就是为什么铿锵不明白它。

+0

谢谢你的回应,但我知道错字,我在原文中指出。我想知道一个错字是如何导致整数和char **之间的比较。 –

相关问题