3

Compile error on exceptions

 2 years ago
source link: https://www.codesd.com/item/compile-error-on-exceptions.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Compile error on exceptions

advertisements

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.

Tags exception

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK