-3 c command-line
我正在尝试创建一个非常简单的程序,它包含两个.c文件 - main.c和foo.c.
目标是链接这两个文件,并将参数传递给main.c方法,然后调用foo.c文件中的方法foo().
main.c的代码是:
#include <stdio.h>
#include "foo.h"
int main(int argc, char *argv[]) {
foo(argv[1]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
和foo.c是:
#include <stdio.h>
#include "foo.h"
void foo(char *input[]) {
printf("Welcome, %s\n", input);
}
Run Code Online (Sandbox Code Playgroud)
我还有一个头文件,foo.h,它只有一行:void foo(char*input []);
当我尝试使用构建和运行文件时
gcc -o main main.c foo.c foo.h
Run Code Online (Sandbox Code Playgroud)
我收到了错误
main.c: In function ‘main’:
main.c:6:2: warning: passing argument 1 of ‘foo’ from incompatible pointer type [enabled by default]
foo(argv[1]);
^
In file included from main.c:2:0:
foo.h:1:6: note: expected ‘char **’ but argument is of type ‘char *’
void foo(char *input[]);
Run Code Online (Sandbox Code Playgroud)
我的代码在哪里出错了?我一直试图玩它一段时间.请注意,当我运行./main"Test"时,它会打印Welcome,Test,即正确的预期输出,但是警告错误会让我烦恼.另外,如何编写一个简单的makefile来编译这3个文件,而不是每次都输入gcc?我试着做以下事情:
CFLAGS=-Wall -g
all: main foo
clean:
rm -f main foo
Run Code Online (Sandbox Code Playgroud)
但输入"make"不会编译任何东西.
谢谢.
我不知道你把它带到了哪里
void foo(char *input[]) {
printf("Welcome, %s\n", input);
}
Run Code Online (Sandbox Code Playgroud)
从,但它肯定是错的.
它应该是
void foo(char *input) {
printf("Welcome, %s\n", input);
}
Run Code Online (Sandbox Code Playgroud)
argv[1]is 的类型char *和使用char input[]虽然有效,但是没有必要,因为它无论如何都转换为指针,甚至char input[10]会有类型char *,如果你试图使用sizeof运算符,这是特别糟糕的.
在我看来,这只是我的意见,你永远不应该让你的代码像Java一样void foo(char input[]),有些人有一个论证,说它是好的,知道你将数组传递给函数,但它没有因为最后它只是一个指向数组第一个元素的指针.