2012-02-25 3 views
1

Обычно я этого не делал, но для проекта, над которым я сейчас работаю, требуется пара функций, которые находятся в исходном файле c.c в практиках C++

extern "C" { 
    int words(char sentence[]); 
    int match(char str[], char sentence[], int n); 
} 

Я просто хочу знать, где лучшее место, чтобы добавить эти прототипы связующих функций в C?

Должен ли он быть добавлен в исходный файл C++ (в моем случае, command.cpp) или заголовок c/C++? (command.h)

+0

Иногда исходный код C компилируется с помощью C++-компилятора без чрезмерных усилий (я предполагаю, что эти две функции не слишком длинны). Это стоит попробовать. В противном случае будут использоваться ответы ниже с использованием этих макросов. –

ответ

5

Наименее подвержен ошибкам способ поместить объявления в общем файле C & C заголовочный ++ и #ifdefextern "C" { должен использоваться только компилятором C++ (это ошибка синтаксиса в C):

#ifdef __cplusplus 
extern "C" { 
#endif 
    int words(char sentence[]); 
    int match(char str[], char sentence[], int n); 
#ifdef __cplusplus 
} 
#endif 

лично я также, как этот вариант предварительных # определяющего макроса для незаданной extern синтаксиса:

#ifdef __cplusplus 
#define CFUN extern "C" 
#else 
#define CFUN 
#endif 

CFUN int words(char sentence[]); 
CFUN int match(char str[], char sentence[], int n); 

Это держит грязный #ifdef материал локализованный. Вы можете разместить его в одном из ваших файлов заголовков проекта и использовать спецификатор CFUN в любом месте. Вы можете указать префикс имени макроса CFUN, если он может столкнуться с существующим определением.

1

Ну, так как они являются прототипами функций, то применяются те же стандарты, что и в C++. Вы должны добавить их в файл заголовка. Если я полностью не понял ваш вопрос.

3

Стандартная идиома предназначена для заголовка использовать макрос __cplusplus, который задает C++. Так что, если ваш блок C перевод имеет реализацию в file.c, то можно было бы написать заголовок file.h следующим образом:

#ifndef H_FILE 
#define H_FILE 

#ifdef __cplusplus 
extern "C" { 
#endif 

int words(char sentence[]); 
int match(char str[], char sentence[], int n); 

#ifdef __cplusplus 
} // extern "C" 
#endif 

#endif // include guard 

Теперь вы можете использовать один и тот же заголовок, как в C и C++ перевода единиц.

+0

Исходные файлы не содержат файл заголовка, к сожалению (и я не могу его сделать). – TheAJ

+1

Как вы можете «не разрешить сделать один»? Какой странный вопрос программирования не «позволяет» вам выполнять определенные программы? –

+0

Вы говорите мне, это инструкции моего профессора. В принципе, мы должны включить некоторые функции, которые мы написали на C из нашего предыдущего задания, в наше новое задание. Нам не разрешено редактировать/изменять что-либо, но может включать только файл C (wordutils.c). – TheAJ

1

Я бы поместил их в файл cpp, в том же месте, где вы обычно помещаете свои объявления вперед. Если вы используете их в нескольких файлах cpp, рассмотрите заголовок. Только затем.

+1

Это будет работать хорошо, но лично я считаю, что если мне нужно что-то обновить в 2-х местах, я, вероятно, забуду сделать это в одном из них. Размещение объявления в заголовке вызовет ошибку компиляции, если вы измените подпись функции в ее определении, но не в заголовке. Сохранение их раздельности не приведет к сбою компиляции или ссылок в этом случае, вы просто получите странные эффекты времени исполнения. Люди умнее или менее забывчивы, чем я, могут игнорировать этот совет. :) – pmdj

0

Определенно, в файле заголовка будет плюсом! Но ifdef следует использовать, чтобы избежать множественного определения. Но в данном случае это не проблема.

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