在C+;中调用函数时出现编译器错误+; 我对C++比较陌生,通过提问来学习。我正试图使用getopt来管理我的输入,我创建了一些函数来帮助使程序更清晰。以下是我正在做的(片段):

在C+;中调用函数时出现编译器错误+; 我对C++比较陌生,通过提问来学习。我正试图使用getopt来管理我的输入,我创建了一些函数来帮助使程序更清晰。以下是我正在做的(片段):,c++,compiler-errors,declaration,signature,C++,Compiler Errors,Declaration,Signature,有人能帮我理解这个问题吗?我确信这与我对argv相关指针的工作方式理解不足有关 谢谢 Dan您的函数签名不匹配 void processArgs(int,char*,char**,long int*) void processArgs(int-argc,char**argv,long int*res) 检查字符* 您可以从void processArgs(int,char*,char**,long int*)中删除char*或您可以删除完整的行 这里是因为您已经在main()上面定义了函数,所以

有人能帮我理解这个问题吗?我确信这与我对argv相关指针的工作方式理解不足有关

谢谢
Dan

您的函数签名不匹配

void processArgs(int,char*,char**,long int*)

void processArgs(int-argc,char**argv,long int*res)

检查字符*

您可以从
void processArgs(int,char*,char**,long int*)中删除
char*
或您可以删除完整的行


这里是因为您已经在
main()
上面定义了函数,所以不需要使用
void processArgs(int,char*,char**,long int*)在函数之前,因为编译器在编译
main()

之前已经获得了函数签名。首先,正如rajenpandit已经说过的,您的声明和定义签名是不同的。 其次,我假设由于最后一个参数,它无法调用函数:函数需要
long int*
,而您为它提供了
int*

,您的代码中的第一个明显问题(对于程序员!)已经说明了它是不匹配的,但正如发现的那样,编译器并没有就此停止。调用本身与您给出的两个声明中的任何一个都不匹配。这就是编译器所说的


顺便说一句: 在C/C++中声明函数的最简单方法是:使用剪贴板(手动添加分号):


复制粘贴方法还有另一个优点:函数声明还包含参数名,如果有多个参数,这尤其有用。许多IDE在您键入调用时也会显示这些名称作为提示。

请考虑这两个函数声明声明了不同的函数,因为它们具有不同数量的参数

void processArgs(int,char *,char **,long int *);

void processArgs(int argc, char ** argv, long int * res);
然而,这不是错误的原因

编译器的错误消息令人困惑。问题在于,在第二个函数声明(同时也是一个定义)中,第三个参数被声明为具有类型

long int *
但是,您可以调用作为参数传递给它的函数类型为的对象(变量结果)

下面是传递给函数对象和函数调用的定义

  int * results=NULL;
  processArgs(argc,argv,results);
没有从
int*
long int*
的隐式转换


因此编译器会发出错误。

我想在本例中添加一个关于重新格式化和/或省略声明的建议。太棒了。我没看到,谢谢。你我总是被告知在头文件中添加声明,然后在主文件中定义函数。那么情况不是这样吗?主要的概念是在函数调用之前需要提供函数签名,如果将签名放在头文件中,则函数签名可以提供给多个文件,其中只需要包含该头文件即可进行函数调用。您的描述不太好:失败的不是函数调用,而是编译器错误。+1您的答案可能更好,如果你重新排列参数。仔细观察编译器错误,这是一个好主意——大多数读者显然在第一个明显错误时就停止了阅读。顺便说一句:你的答案中有一个问题。@Wolf有什么问题?让我们先看看第二件事。:)
void processArgs(int,char *,char **,long int *);

void processArgs(int argc, char ** argv, long int * res);
long int *
int *
  int * results=NULL;
  processArgs(argc,argv,results);