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“在杂项一中。如何知道哪个库也可以声明与我相同的函数?