我正在尝试创建一个非常简单的程序,它包含两个.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;
}
和foo.c是:
#include <stdio.h>
#include "foo.h"
void foo(char *input[]) {
printf("Welcome, %s\n", input);
}
我还有一个头文件,foo.h只有一行: void foo(char * input []);
当我尝试使用
构建和运行文件时gcc -o main main.c foo.c foo.h
我收到错误
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[]);
我的代码在哪里出错了?我一直试图玩它一段时间。请注意,当我运行./main“Test”时,它会打印Welcome,Test,即正确的预期输出,但警告错误会让我烦恼。另外,如何编写一个简单的makefile来编译这3个文件,而不是每次都输入gcc?我试着做以下事情:
CFLAGS=-Wall -g
all: main foo
clean:
rm -f main foo
但输入“make”不会编译任何内容。
感谢。
答案 0 :(得分:5)
我不知道你把它带到了哪里
void foo(char *input[]) {
printf("Welcome, %s\n", input);
}
来自,但它肯定是错的。
应该是
void foo(char *input) {
printf("Welcome, %s\n", input);
}
argv[1]
的类型为char *
并使用char input[]
虽然有效,但没有必要,因为它无论如何都会转换为指针,即使char input[10]
也会有键入char *
,如果您尝试使用sizeof
运算符,则会特别糟糕。
在我看来,这只是我的意见,你永远不应该让你的代码像Java void foo(char input[])
那样,有些人有一个论据说它做到这一点很好知道你正在将一个数组传递给函数,但它并不重要,因为它最终只是一个指向数组第一个元素的指针。
答案 1 :(得分:3)
在这里void foo(char *input[])
输入是char指针类型的数组,它应该只是void foo(char input[])
。应遵循的规则是传递的实际参数和被接收的函数中的形式参数应该是相同类型的。