我对C ++比较陌生,我正在通过问题来学习。我正在尝试使用getopt来管理我的输入,并且我已经创建了函数来帮助使程序更清晰。这就是我正在做的事情(片段):
void processArgs(int,char *,char **,long int *);
void processArgs(int argc, char ** argv, long int * res)
{
globalArgs.startTerm = NULL;
globalArgs.endTerm = NULL;
globalArgs.outFileName = NULL;
globalArgs.verbosity = 0;
int minimumArgs = 1;
//Check for minimum number of parameters
if (argc<minimumArgs){
displayUsage();
}
}
int main(int argc,char * argv[]){
int * results=NULL;
processArgs(argc,argv,results);
return 0;
}
当我运行以下编译时,我得到:
g++ -std=c++0x fibonacci.cpp -o fibonacci
fibonacci.cpp: In function âint main(int, char**)â:
fibonacci.cpp:68: error: no matching function for call to âprocessArgs(int&, char**&, int*&)â
fibonacci.h:3: note: candidates are: void processArgs(int, char*, char**, long int*)
fibonacci.cpp:46: note: void processArgs(int, char**, long int*)
有人可以帮我理解这个问题吗?我确定这与我对与argv相关的指针如何工作的理解减少有关。
由于 丹
答案 0 :(得分:3)
您的功能签名不匹配
void processArgs(int,char *,char **,long int *);
void processArgs(int argc, char ** argv, long int * res)
检查char *
您可以从char *
删除void processArgs(int,char *,char **,long int *);
,也可以删除整行。
这里因为你已经定义了main()
以上的函数所以不需要在函数之前使用void processArgs(int,char *,char **,long int *);
,因为编译器在编译main()
之前已经获得了函数签名。
答案 1 :(得分:2)
考虑到这两个函数声明声明了不同的函数,因为它们具有不同数量的参数
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);
没有从int *
到long int *
因此编译器会发出错误。
答案 2 :(得分:1)
首先,正如 rajenpandit 已经说过,您的声明和定义签名是不同的。
其次,我认为由于最后一个参数而无法调用该函数:函数需要long int *
,而你提供int *
。
答案 3 :(得分:1)
代码中的第一个显而易见的问题(对于程序员!) - rajenpandit已经说明了 - signature不匹配 - 但是 - Vlad from Moscow找到了{{3}} - 编译器并没有就此止步。 调用本身与您提供的两个声明中的任何一个都不匹配。这就是编译器所说的。
顺便说一句: 在C / C ++中声明函数的最简单方法:使用剪贴板(手动添加分号):
void processArgs(int argc, char ** argv, long int * res);
void processArgs(int argc, char ** argv, long int * res)
{
// your function body
}
复制和粘贴方法还有另一个优点:函数声明还包含参数名称,如果有多个参数,这将特别有用。当您键入呼叫时,许多IDE还会将这些名称显示为提示。