Множественное определение textFileRead (char *)

Я использую этот заголовочный файл для чтения текстовых файлов (я использую его для загрузки шейдерных файлов) и использую его в двух разных классах.

Я получаю сообщение об ошибке Multiple Definition textFileRead (char *).

Вот заголовочный файл:

#ifndef READFILE_H
#define READFILE_H

#include "stdio.h"#include "stdlib.h"#include "string.h"#include "string"#include "fstream"
char *textFileRead(char *fn) {

FILE *fp;
char *content = NULL;

int count=0;

if (fn != NULL) {
fp = fopen(fn,"rt");

if (fp != NULL) {

fseek(fp, 0, SEEK_END);
count = ftell(fp);
rewind(fp);

if (count > 0) {
content = (char *)malloc(sizeof(char) * (count+1));
count = fread(content,sizeof(char),count,fp);
content[count] = '\0';
}
fclose(fp);
}
}
return content;
}#endif READFILE_H

Что я делаю неправильно?

0

Решение

Функции, определенные в заголовке, должны быть помечены как inline предотвратить множественное определение.

Либо это, либо отделить реализацию от файла реализации.

Включите защиту от множественного определения в одном и том же переводчике, это проблема компоновщика. Символ определяется несколько раз в единицах перевода.

0

Другие решения

Вы должны убедиться, что код из вашего заголовочного файла включен только один раз для каждой единицы компиляции. Для этого вы должны поместить это в начало файла:

#ifndef READFILE_H
#define READFILE_H

и это в конце:

#endif

Конечно, идентификатор READFILE_H должен быть уникальным для каждого файла. Следующее, что нужно сделать: оставить в заголовке только объявления ваших функций и классов, реализации должны находиться в отдельном файле реализации (.c или .cpp или .cc). Таким образом, в вашем заголовке вы будете иметь объявление только вашей функции:

char *textFileRead(char *);

и определение вашей функции будет в отдельном файле .c.

0

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

Один из способов исправить это — переместить реализацию в исходный файл и оставить объявление в заголовочном файле, например так:

readfile.h

#ifndef READFILE_H
#define READFILE_H

char *textFileRead(char *fn);

#endif

readfile.cpp

#include "readfile.h"#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <fstream>

char *textFileRead(char *fn)
{
FILE *fp;
char *content = NULL;
int count=0;

/* ... code ... */

return content;
}

Другое решение состоит в том, чтобы отметить функцию inline и оставьте реализацию в заголовочном файле. Как это:

#ifndef READFILE_H
#define READFILE_H

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <fstream>

inline char *textFileRead(char *fn)
{
FILE *fp;
char *content = NULL;

/* ... code ... */

return content;
}

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

Также возможно использовать static на месте inline в приведенном выше примере, или окружить определение в анонимном пространстве имен. Однако ни один из этих методов не рекомендуется. Если у вас нет особых причин, по которым вы хотите встроить свою функцию и сделать ее тело доступным в заголовочном файле, я бы выбрал первый вариант.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector