проблема с "множественным определением" - PullRequest
0 голосов
/ 25 сентября 2011

Скажем, у меня очень маленький заголовочный файл, например:

#ifndef A_H_
#define A_H_

void print();
int getInt()
{ //ERROR HERE
    return 5;
}

#endif /* A_H_ */

И исходный файл, реализующий печать так:

#include "a.h"

void print()
{
    printf("%d\n",getInt()); //WARNING HERE
}

И мой код функции main ():

#include <stdio.h>
#include <stdlib.h>
#include "a.h"

int main(void)
{
    print();
    return EXIT_SUCCESS;
}

Обратите внимание, что getInt определяется в заголовочном файле и вызывается в исходном файле. Когда я компилирую, я получаю multiple definition of getInt'` в заголовочном файле, но я только определил это один раз! Исходный файл (.c) только вызывает его. В чем моя проблема? Спасибо

Ответы [ 2 ]

1 голос
/ 25 сентября 2011

Вы должны переместиться getInt() в переменный ток, т.е.

ах:

#ifndef A_H_
#define A_H_

void print(void);
int getInt(void);

#endif /* A_H_ */

переменный ток:

#include <stdio.h>
#include "a.h"

void print(void)
{
    printf("%d\n",getInt());
}

int getInt(void)
{
    return 5;
}

main.c:

#include <stdio.h>
#include <stdlib.h>
#include "a.h"

int main(void)
{
    print();
    return EXIT_SUCCESS;
}

Как правило, интерфейсы (т. Е. прототипы для доступных извне функций, а также связанные определения типов и константы и т. Д.) Содержатся в файлах .h, тогда как omplementations (т.е. фактические определения функций, а также частные (статические) функции и другие внутренние элементы) принадлежат файлам .c.

1 голос
/ 25 сентября 2011

Вы, вероятно, включаете свой заголовочный файл в другой исходный файл. Вы можете попытаться переместить определение в файл .c или объявить getInt() как inline.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...