Используйте функцию C в программе C ++; «многократная» ошибка - PullRequest
3 голосов
/ 02 мая 2010

Я пытаюсь использовать этот код для алгоритма портера Портера в программе на C ++, которую я уже написал. Я следовал инструкциям в конце файла для использования кода в качестве отдельного модуля. Я создал файл, stem.c, который заканчивается после определения и имеет

extern int stem(char * p, int i, int j) ...

В Xcode он работал нормально, но у меня не работает в Unix с gcc 4.1.1 - странно, потому что обычно у меня нет проблем с перемещением между ними. Я получаю ошибку

* +1007 *

ld: fatal: символ `stem (char *, int, int) 'имеет несколько значений: (файл /var/tmp//ccrWWlnb.o type = FUNC; файл /var/tmp//cc6rUXka.o type = FUNC); ld: fatal: Ошибки обработки файлов. Нет выходных данных, записанных в кластер

Я посмотрел в Интернете, и, похоже, есть много вещей, которые я мог ошибиться, но я не уверен, какая комбинация файла заголовка, extern "C" и т. Д. Сработает.

Ответы [ 3 ]

12 голосов
/ 02 мая 2010

Эта ошибка означает, что символ (основа) определен в более чем одном модуле.

Вы можете объявить символ в любом количестве модулей. объявление функции выглядит так:

int stem(char * p, int i, int j);

Вам не нужно ключевое слово "extern", хотя оно ничего не ранит. Для объявлений функций это подразумевается.

A определение функции выглядит так:

int stem(char * p, int i, int j) 
{
    /* body of your function */
}

Ошибка «множественное определение» означает, что у вас есть два модуля с определением для одной и той же функции. Обычно это означает, что у вас есть два файла, которые определяют функцию, или два файла, которые #include файл, который определяет функцию. Обычно вы не должны помещать определения функций в файлы, которые вы #include. Поместите определение в файл .c, .cpp или .cc и просто поместите объявление в файл .h, который вы # включаете.

Например, вы можете создать файл stem.h со следующим:

int stem(char * p, int i, int j);

Тогда #include "stem.h".

0 голосов
/ 02 мая 2010

Вам нужно добавить «С». Вам нужно ввести "C" {...} и определить функцию только один раз. Но вы можете объявить его (прототип) так часто, как захотите.

0 голосов
/ 02 мая 2010

Тот факт, что в Whither.cpp есть #include "stem.c", дает первое определение, а определение stem.c в командной строке компилятора дает второе определение.

Вы должны разбить stem.c на заголовочный файл (только с прототипами функций) и файл .c, который содержит реализацию. Включите только заголовочный файл в Whwhat.cpp

...