Директивы препроцессоря и заголовочные файлы
Добавлено: 22 мар 2008, 19:10
Здравстуйте! Есть вопрос по директивам препроцессора Си и по подключению заголовочных файлов.
На данный момент есть прога, состоящая из:
sf.cpp - основной файл
sf.h - заголовочный к нему
dialog.cpp - еще один файл
dialog.h - к нему заголовочный, он инклудится в sf.cpp
structure.h - файл содержащий структуру с которой работает прога
необходимо вынести пару функций из файла sf.cpp в отдельный файл, делаю так:
создаю файл например quicksort.cpp вставляю туда код трех функций, делаю файл quicksort.h
в нем:
#ifndef quicksortH
#define quicksortH
void quicksort(int f);
int partition(void *arr_el[], int a, int b, int f);
void quicksortr(void *m[],int a,int b, int f);
#endif
По образу и подобию сделаны все заголовочные файлы.
В файлах sf.cpp и sf.h коментирую то, что перенес в другой файл.
в Makefile добавляю quicksort.o, он у меня такой:
CC = g++ -g
all: sf
sf: sf.o dialog.o quicksort.o -lncurses
clean:
rm -f *.o *.a sf
в файл dialog.cpp добавляю #include "quicksort.h"
в quicksort.cpp добавляю несколько инклудов:
#include "sf.h"
#include "quicksort.h"
#include <stdlib>
#include <string>
пытаюсь собрать.
g++ -c -o quicksort.o quicksort.cpp
quicksort.cpp: In function ‘void quicksort(int)’:
quicksort.cpp:17: ошибка: нет декларации ‘Curr’ в этой области видимости
quicksort.cpp: In function ‘int partition(void**, int, int, int)’:
quicksort.cpp:27: ошибка: нет декларации ‘RECORD’ в этой области видимости
quicksort.cpp:27: ошибка: нет декларации ‘t’ в этой области видимости
quicksort.cpp:28: ошибка: нет декларации ‘TRANZ’ в этой области видимости
quicksort.cpp:28: ошибка: нет декларации ‘elj’ в этой области видимости
quicksort.cpp:29: ошибка: нет декларации ‘elb’ в этой области видимости
quicksort.cpp:30: ошибка: нет декларации ‘eli’ в этой области видимости
quicksort.cpp:33: ошибка: expected primary-expression before ‘)’ token
quicksort.cpp:33: ошибка: expected `;' before ‘arr_el’
quicksort.cpp:34: ошибка: expected primary-expression before ‘)’ token
quicksort.cpp:34: ошибка: expected `;' before ‘arr_el’
quicksort.cpp:35: ошибка: expected primary-expression before ‘)’ token
quicksort.cpp:35: ошибка: expected `;' before ‘arr_el’
make: *** [quicksort.o] Ошибка 1
[speccyfan@localhost kurs]$
Ну понятно не видит структуру и соотвественно указатели, добавляю #include "structure.h"
Получается вот что:
[speccyfan@localhost kurs]$ make
g++ -c -o quicksort.o quicksort.cpp
g++ -g sf.o dialog.o quicksort.o /usr/lib/libncurses.so -o sf
quicksort.o:(.bss+0x4): multiple definition of `Curr'
sf.o:(.bss+0x4): first defined here
quicksort.o:(.bss+0x0): multiple definition of `Head'
sf.o:(.bss+0x0): first defined here
quicksort.o:(.bss+0x8): multiple definition of `End'
sf.o:(.bss+0x8): first defined here
collect2: выполнение ld завершилось с кодом возврата 1
make: *** [sf] Ошибка 1
[speccyfan@localhost kurs]$
Дейсвтительно structure.h инклудится и в сам sf.cpp, как бьть ?
конструкции виде #ifndef не помогают
Можно как-нибудь намутить, что б это все собралось ?
На данный момент есть прога, состоящая из:
sf.cpp - основной файл
sf.h - заголовочный к нему
dialog.cpp - еще один файл
dialog.h - к нему заголовочный, он инклудится в sf.cpp
structure.h - файл содержащий структуру с которой работает прога
необходимо вынести пару функций из файла sf.cpp в отдельный файл, делаю так:
создаю файл например quicksort.cpp вставляю туда код трех функций, делаю файл quicksort.h
в нем:
#ifndef quicksortH
#define quicksortH
void quicksort(int f);
int partition(void *arr_el[], int a, int b, int f);
void quicksortr(void *m[],int a,int b, int f);
#endif
По образу и подобию сделаны все заголовочные файлы.
В файлах sf.cpp и sf.h коментирую то, что перенес в другой файл.
в Makefile добавляю quicksort.o, он у меня такой:
CC = g++ -g
all: sf
sf: sf.o dialog.o quicksort.o -lncurses
clean:
rm -f *.o *.a sf
в файл dialog.cpp добавляю #include "quicksort.h"
в quicksort.cpp добавляю несколько инклудов:
#include "sf.h"
#include "quicksort.h"
#include <stdlib>
#include <string>
пытаюсь собрать.
g++ -c -o quicksort.o quicksort.cpp
quicksort.cpp: In function ‘void quicksort(int)’:
quicksort.cpp:17: ошибка: нет декларации ‘Curr’ в этой области видимости
quicksort.cpp: In function ‘int partition(void**, int, int, int)’:
quicksort.cpp:27: ошибка: нет декларации ‘RECORD’ в этой области видимости
quicksort.cpp:27: ошибка: нет декларации ‘t’ в этой области видимости
quicksort.cpp:28: ошибка: нет декларации ‘TRANZ’ в этой области видимости
quicksort.cpp:28: ошибка: нет декларации ‘elj’ в этой области видимости
quicksort.cpp:29: ошибка: нет декларации ‘elb’ в этой области видимости
quicksort.cpp:30: ошибка: нет декларации ‘eli’ в этой области видимости
quicksort.cpp:33: ошибка: expected primary-expression before ‘)’ token
quicksort.cpp:33: ошибка: expected `;' before ‘arr_el’
quicksort.cpp:34: ошибка: expected primary-expression before ‘)’ token
quicksort.cpp:34: ошибка: expected `;' before ‘arr_el’
quicksort.cpp:35: ошибка: expected primary-expression before ‘)’ token
quicksort.cpp:35: ошибка: expected `;' before ‘arr_el’
make: *** [quicksort.o] Ошибка 1
[speccyfan@localhost kurs]$
Ну понятно не видит структуру и соотвественно указатели, добавляю #include "structure.h"
Получается вот что:
[speccyfan@localhost kurs]$ make
g++ -c -o quicksort.o quicksort.cpp
g++ -g sf.o dialog.o quicksort.o /usr/lib/libncurses.so -o sf
quicksort.o:(.bss+0x4): multiple definition of `Curr'
sf.o:(.bss+0x4): first defined here
quicksort.o:(.bss+0x0): multiple definition of `Head'
sf.o:(.bss+0x0): first defined here
quicksort.o:(.bss+0x8): multiple definition of `End'
sf.o:(.bss+0x8): first defined here
collect2: выполнение ld завершилось с кодом возврата 1
make: *** [sf] Ошибка 1
[speccyfan@localhost kurs]$
Дейсвтительно structure.h инклудится и в сам sf.cpp, как бьть ?
конструкции виде #ifndef не помогают
Можно как-нибудь намутить, что б это все собралось ?