C++ 关于异常的编译错误

C++ 关于异常的编译错误,c++,exception,g++,C++,Exception,G++,我遇到了一些编译错误,但不知道是什么问题。代码似乎没有使用异常,但错误与此有关 //in misc.h: char *basename(char *name); // line 94 // in misc.cc: char *basename(char *name) { // line 12 char *result = name; while(*name) { if(*name == '/') result = name + 1; name++;

我遇到了一些编译错误,但不知道是什么问题。代码似乎没有使用异常,但错误与此有关

//in misc.h:
char *basename(char *name); // line 94

// in misc.cc:
char *basename(char *name) {   // line 12
  char *result = name;  
  while(*name) {  
    if(*name == '/') result = name + 1;  
    name++;  
  }  
  return result;  
}  
编译错误

g++ -pipe -W -Wall -fopenmp -ggdb3 -O2  -c -o misc.o ../../src/misc.cc  
../../src/misc.cc: In function ‘char* basename(char*)’:  
../../src/misc.cc:12: error: declaration of ‘char* basename(char*)’ throws different exceptions  
../../src/misc.h:94: error: from previous declaration ‘char* basename(char*) throw ()’  
make: *** [misc.o] Error 1
有人有什么线索吗?谢谢和问候


编辑: 杂项h中包含的文件包括

#include <iostream>  
#include <cmath>  
#include <fstream>  
#include <cfloat>  
#include <stdlib.h>  
#include <string.h>
“../../src/misc.h:94:错误:来自上一个声明'char*basename(char*)throw()'”

我把它理解为已经声明了两次,一次使用throw(),一次不使用。

“../../src/misc.h:94:错误:来自上一次声明'char*basename(char*)throw()'”


我把它解读为已经声明了两次,一次使用throw(),一次不使用。

为我编译了相同的标志。 g++(Gentoo 4.3.4 p1.0,pie-10.1.5)4.3.4

您的错误表示存在“char*basename(char*)throw()声明”


试着打开misc.h并搜索整个文件中的抛出,看看你是否自己把抛出放进去了,只是忘记了它。

为我编译了相同的标志。
//in misc.h:
char *basename(char *name); // line 94

// in misc.cc:
char *basename(char *name) {   // line 12
  char *result = name;  
  while(*name) {  
    if(*name == '/') result = name + 1;  
    name++;  
  }  
  return result;  
}  
g++(Gentoo 4.3.4 p1.0,pie-10.1.5)4.3.4

您的错误表示存在“char*basename(char*)throw()声明”


尝试打开misc.h并搜索整个文件中的throw,以查看是否您自己将throw放入了文件中而忘记了它。

您可能从libgen.h中获取了basename()的定义。在我的OpenSUSE系统上,libgen.h中的版本在末尾用“throw()”定义(通过_throw宏)

//in misc.h:
char *basename(char *name); // line 94

// in misc.cc:
char *basename(char *name) {   // line 12
  char *result = name;  
  while(*name) {  
    if(*name == '/') result = name + 1;  
    name++;  
  }  
  return result;  
}  
您可以尝试的一件事是,通过添加-E标志,然后搜索basename以查看定义的内容,告诉gcc仅运行预处理器阶段:

g++ -pipe -W -Wall -fopenmp -ggdb3 -O2  -E -o misc.i ../../src/misc.cc  

如果发生这种情况,您需要删除libgen.h的include,匹配抛出说明符或更改函数名。

您可能正在从libgen.h获取basename()的定义。在我的OpenSUSE系统上,libgen.h中的版本在末尾用“throw()”定义(通过_throw宏)

您可以尝试的一件事是,通过添加-E标志,然后搜索basename以查看定义的内容,告诉gcc仅运行预处理器阶段:

g++ -pipe -W -Wall -fopenmp -ggdb3 -O2  -E -o misc.i ../../src/misc.cc  

如果发生这种情况,您需要删除libgen.h的include,匹配throw说明符或更改函数名。

在misc.h中未找到“throw”,而misc.cc.在misc.h和misc.cc中未找到“throw”。“basename”在misc.h中仅定义一次,在整个文件中未定义“throw”。“basename”在misc.h中仅定义一次,不要把整个文件都扔掉谢谢Samuel。所以我更改了我的函数名,现在我可以成功地编译它了。不过我还在想。我没有在任何源文件中明确包含libgen.h。那么它是否隐含在每个C++程序和G++中呢?还是其他系统库?是否有可能找出造成混淆的系统库文件?C要求头是独立的;C++没有。因此,任何C++头可以包括任何其他的,这可能是正在发生的事情。使用仅限预处理器的建议查看发生了什么。谢谢,乔纳森!“C要求头是独立的”您的意思是在C中头不能包含另一个头吗?当预处理成功,而编译产生了像我这样的错误时,它能说什么?@Tim-要找出谁包括libgen.h,首先你应该运行预处理器(使用我回答中提到的-E标志)。然后查看生成的文件(我的示例中的misc.i),并查找类似“#number/path/to/libgen.h”的行(请注意,number将是一个数字,而不是文本号)。然后查看该行前面的行,该行应提及包括libgen.h在内的头文件。塞缪尔:谢谢!没有找到”libgen.h“在杂项一中。你怎么知道哪个库也可以声明与我相同的函数呢?谢谢,Samuel。所以我更改了我的函数名,现在我可以成功地编译它了。不过我还在想。我没有在任何源文件中明确包含libgen.h。那么它是否隐含在每个C++程序和G++中呢?还是其他系统库?是否有可能找出造成混淆的系统库文件?C要求头是独立的;C++没有。因此,任何C++头可以包括任何其他的,这可能是正在发生的事情。使用仅限预处理器的建议查看发生了什么。谢谢,乔纳森!“C要求头是独立的”您的意思是在C中头不能包含另一个头吗?当预处理成功,而编译产生了像我这样的错误时,它能说什么?@Tim-要找出谁包括libgen.h,首先你应该运行预处理器(使用我回答中提到的-E标志)。然后查看生成的文件(我的示例中的misc.i),并查找类似“#number/path/to/libgen.h”的行(请注意,number将是一个数字,而不是文本号)。然后查看该行前面的行,该行应提及包括libgen.h在内的头文件。塞缪尔:谢谢!没有找到”libgen.h“在杂项一中。如何知道哪个库也可以声明与我相同的函数?