将 "argc" 拼错为 "argv" 会导致比较 char ** 和 int - 为什么?
Misspelling "argc" as "argv" results in a comparison between a char ** and an int - why?
为了简单起见,就拿这一段没用的代码来说吧。如果我尝试使用 clang 编译以下代码片段,我会收到以下错误消息:
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")。我想知道的是为什么会这样导致比较a char ** 和 if 语句中的 int?这是否意味着 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
clang遇到错误时argc
好像是auto-corrected到argv
argc_test.c:5:9: error: use of undeclared identifier 'argc'; did you mean 'argv'?
当然,如果您将 argv
与 4
进行比较,您是在将指针与整数进行比较。
这种auto-correction叫做"fix-it hints",见https://clang.llvm.org/diagnostics.html。
int main(int agrc, char *argv[])
声明 ARGC 整数时出错 - 您将其称为 AGRC。
我想这就是为什么 clang 不理解它的原因。
为了简单起见,就拿这一段没用的代码来说吧。如果我尝试使用 clang 编译以下代码片段,我会收到以下错误消息: 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")。我想知道的是为什么会这样导致比较a char ** 和 if 语句中的 int?这是否意味着 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
clang遇到错误时argc
好像是auto-corrected到argv
argc_test.c:5:9: error: use of undeclared identifier 'argc'; did you mean 'argv'?
当然,如果您将 argv
与 4
进行比较,您是在将指针与整数进行比较。
这种auto-correction叫做"fix-it hints",见https://clang.llvm.org/diagnostics.html。
int main(int agrc, char *argv[])
声明 ARGC 整数时出错 - 您将其称为 AGRC。 我想这就是为什么 clang 不理解它的原因。