将“argc”拼写为“argv”会导致 char ** 和 int 之间的比较 - 为啥?

Posted

技术标签:

【中文标题】将“argc”拼写为“argv”会导致 char ** 和 int 之间的比较 - 为啥?【英文标题】:Misspelling "argc" as "argv" results in a comparison between a char ** and an int - why?将“argc”拼写为“argv”会导致 char ** 和 int 之间的比较 - 为什么? 【发布时间】:2017-06-06 05:20:30 【问题描述】:

为了简单起见,就拿这段无用的代码。如果我尝试使用 clang 编译下面的 sn-p 代码,我会收到以下错误消息: argc_test.c:5:14: 错误:指针和整数之间的比较 ('char **' 和 'int') [-Werror] if (argc != 4)

代码:

#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 **,即使我没有声明它?

这不是我收到的唯一错误消息,它只是一个突出的错误消息。这是完整的命令行输出:

~/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 重新解释一个错字并假设您的意思是别的东西提供搜索结果? 【参考方案1】:

当clang遇到错误时,argc似乎自动更正为argv

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

当然,如果您将argv4 进行比较,则您将指针与整数进行比较。

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

【讨论】:

没有“自动更正”,名称是任意的,如果调用函数中的参数是实际定义,在这种情况下main很重要,【参考方案2】:

int main(int agrc, char *argv[])

声明 ARGC 整数时出错 - 您将其称为 AGRC。 我想这就是 clang 不理解的原因。

【讨论】:

感谢您的回复,但我知道错字,我在原帖中指出了它。我想知道一个错字是如何导致整数和字符 ** 之间的比较的。

以上是关于将“argc”拼写为“argv”会导致 char ** 和 int 之间的比较 - 为啥?的主要内容,如果未能解决你的问题,请参考以下文章

argc 和 argv 的目的是啥? [复制]

c语言中命令行参数argc,argv[ ]

main (int argc,char *argv[]) 或main (int argc,char **argv)区别

c语言中命令行参数argc,argv[]详解

int main(int argc, char* argv[]) 和 int main(int argc, char** argv) [关闭]

int main(int argc,char *argv[])与int main(int argc,char **argv)区别?