2010-01-03 3 views
1

Я встретил некоторую ошибку компиляции, но не знаю, в чем проблема. Код, похоже, не использует исключение, но ошибка об этом.ошибка сборки об исключениях

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

ли кто-то есть ключ? Спасибо и приветствую!


EDIT: Файлы, включенные в misc.h являются

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

EDIT: в misc.i генерируемой опцией -E,

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

ответ

4

Возможно, вы выбрали определение basename() из libgen.h. В моей системе OpenSUSE версия в libgen.h определяется с помощью «throw()» в конце (через макрос __THROW).

Одна вещь, вы можете попробовать это сказать GCC лишь запустить этап препроцессора, добавив флаг -E, а затем искать базовое имя, чтобы увидеть, что определяется:

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

Если это происходит, вам 'либо нужно отказаться от include libgen.h, сопоставить спецификатор throw или изменить имя вашей функции.

+0

Спасибо, Самуил. Поэтому я меняю имя своей функции, и теперь я могу скомпилировать ее успешно. Все еще интересно. Я не указываю явно libgen.h в любом из исходных файлов. Так не подразумевается ли она в каждой программе на C++ и g ++ или какая-то другая системная библиотека? Можно ли узнать, какой файл системной библиотеки вызывает путаницу? – Tim

+0

C требует, чтобы заголовки были независимыми; C++ - нет. Таким образом, любой заголовок C++ может включать в себя любые другие - и это может быть то, что происходит. Используйте только препроцессор, чтобы узнать, что происходит. –

+0

Спасибо, Джонатан! Под «C требуется, чтобы заголовки были независимыми», вы имеете в виду, что в заголовке C нельзя включить другой заголовок? Что можно сказать, когда препроцессия успешна, а компиляция дает ошибку, как моя? – Tim

2

".. /../src/misc.h:94: ошибка: из предыдущего объявления 'char * basename (char *) throw()' "

Я читаю это как объявленное дважды, один раз с throw() и один раз без него.

+0

«basename» определяется только один раз в файле misc.h, а «throw» во всем файле отсутствует. – Tim

1

Компиляция для меня, те же флаги. г ++ (Gentoo 4.3.4 p1.0, пирог-10.1.5) 4.3.4

Ваша ошибка говорит, что есть декларация 'символ * базовое имя (символ *) бросок()'

попробовать открытие misc.h и поиск броска во всем файле, чтобы убедиться, что вы положили бросок в себя и просто забыли об этом.

+0

Не нашел «throw» в misc.h и misc.cc. – Tim

Смежные вопросы