有关异常的编译错误

时间:2010-01-03 01:43:18

标签: 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++;  
  }  
  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

有人有一些线索吗?谢谢和问候!


编辑: misc.h中包含的文件是

#include <iostream>  
#include <cmath>  
#include <fstream>  
#include <cfloat>  
#include <stdlib.h>  
#include <string.h>

编辑:     在由-E选项生成的misc.i中,

extern "C++" char *basename (char *__filename)  
     throw () __asm ("basename") __attribute__ ((__nonnull__ (1)));  
extern "C++" __const char *basename (__const char *__filename)
     throw () __asm ("basename") __attribute__ ((__nonnull__ (1)));
# 640 "/usr/include/string.h" 3 4
# 1 "/usr/include/bits/string3.h" 1 3 4
# 23 "/usr/include/bits/string3.h" 3 4
extern void __warn_memset_zero_len (void) __attribute__((__warning__ ("memset used with constant zero length parameter; this could be due to transposed parameters")));
# 48 "/usr/include/bits/string3.h" 3 4
extern __inline __attribute__ ((__always_inline__)) __attribute__ ((__gnu_inline__, __artificial__)) void * 
memcpy (void *__restrict __dest, __const void *__restrict __src, size_t __len) throw ()  

{  
  return __builtin___memcpy_chk (__dest, __src, __len, __builtin_object_size (__dest, 0));  
}  
...  
# 641 "/usr/include/string.h" 2 3 4  
...

3 个答案:

答案 0 :(得分:4)

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

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

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

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

答案 1 :(得分:2)

“../../src/misc.h:94:错误:来自之前的声明'char * basename(char *)throw()'”

我正在阅读它已被宣布两次,一次是throw()而一次是没有。

答案 2 :(得分:1)

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

您的错误表明存在'char * basename(char *)throw()'

的声明

尝试打开misc.h并在整个文件中搜索throw,看看你是否把它扔进了自己而忘了它。