开发者

compilation error about exceptions

开发者 https://www.devze.com 2022-12-15 02:46 出处:网络
I met some compilation error but do not know what the problem is. The code seems not use exception, but the error is about it.

I met some compilation error but do not know what the problem is. The code seems not use exception, but the error is about it.

//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;  
}  

Compilation error

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

Does someone have some clue? Thanks and regards!


EDIT: Files included in misc.h are

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

EDIT: in misc.i generated by -E option,

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  
...


You may be picking up the definition of basename() from libgen.h. On my OpenSUSE system, the version in libgen.h is defined with "throw ()" at the end (via the __THROW macro).

One thing you can try is to tell gcc to only run the preprocessor stage by adding the -E flag and then search for basename to see what is being defined:

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

If that is happening, you'll either need to drop the include of libgen.h, match the throw specifier or change the name of your function.


" ../../src/misc.h:94: error: from previous declaration ‘char* basename(char*) throw ()’ "

I'm reading that as having been declared twice, once with throw() and once without.


Compiles for me, same flags. g++ (Gentoo 4.3.4 p1.0, pie-10.1.5) 4.3.4

Your error says that there is a declaration of ‘char* basename(char*) throw ()’

try opening misc.h and searching for throw in the entire file, to see if you put the throw in yourself and just forgot about it.

0

精彩评论

暂无评论...
验证码 换一张
取 消