C++ 中函数调用时编译器错误

Compiler error at function call in C++

本文关键字:编译器 错误 函数调用 C++      更新时间:2023-10-16

我对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 相关的指针如何工作的理解减少有关。

谢谢Dan

您的函数签名不匹配

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

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

检查char *

您可以从void processArgs(int,char *,char **,long int *);中删除char *,也可以删除整行。

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

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

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 *的隐式转换

因此,编译器会发出错误。

首先,正如 rajenpandit 已经说过的,您的声明和定义签名是不同的。其次,我认为由于最后一个参数,它无法调用该函数:该函数期望long int *,而您为其提供int *

代码中第一个明显的问题(对于程序员!)——rajenpandit 已经说过了——是签名不匹配——但是——正如来自莫斯科的 Vlad 所发现的那样——编译器并没有止步于此。调用本身与您给出的两个声明中的任何一个都不匹配。这是编译器所说的。


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

void processArgs(int argc, char ** argv, long int * res);
void processArgs(int argc, char ** argv, long int * res)
{
    // your function body
}

复制和粘贴方法还有另一个优点:函数声明还包含参数名称,这在有多个参数时特别有用。许多 IDE 还会在键入调用时将这些名称显示为提示。