Почему-то я нарушаю одно определение правила - PullRequest
0 голосов
/ 19 июля 2010

Я получаю ошибки с компоновщиком, такие как:

osd.o(.ndata+0x514):C:\Documents and Settings\Thomas\My Documents\PIC\dsPIC33FJ128GP802\On Screen Display\osd.c: multiple definition of `video_buff_vis_num'
main.o(.ndata+0x0):C:\Documents and Settings\Thomas\My Documents\PIC\dsPIC33FJ128GP802\On Screen Display\main.c: first defined here
osd.o(.ndata+0x515):C:\Documents and Settings\Thomas\My Documents\PIC\dsPIC33FJ128GP802\On Screen Display\osd.c: multiple definition of `video_buff_draw_num'
main.o(.ndata+0x1):C:\Documents and Settings\Thomas\My Documents\PIC\dsPIC33FJ128GP802\On Screen Display\main.c: first defined here
osd.o(.ndata+0x516):C:\Documents and Settings\Thomas\My Documents\PIC\dsPIC33FJ128GP802\On Screen Display\osd.c: multiple definition of `vid_format'
main.o(.ndata+0x2):C:\Documents and Settings\Thomas\My Documents\PIC\dsPIC33FJ128GP802\On Screen Display\main.c: first defined here
osd.o(.ndata+0x518):C:\Documents and Settings\Thomas\My Documents\PIC\dsPIC33FJ128GP802\On Screen Display\osd.c: multiple definition of `vid_line'
main.o(.ndata+0x4):C:\Documents and Settings\Thomas\My Documents\PIC\dsPIC33FJ128GP802\On Screen Display\main.c: first defined here

Это меня беспокоит, потому что в исходном коде я включил охрану вокруг единственного места, откуда эти определения могли прийти.

#ifndef OSD_H 
#define OSD_H 

// code here, including definitions for the above

#endif // OSD_H 

Это действует мне на нервы. Я почистил, восстановил и попробовал еще раз. Я даже начал новый проект с нуля с теми же файлами, и у меня точно такая же проблема! Кто-нибудь, пожалуйста, просветите меня, почему это не работает! :)

Компиляция с PIC-GCC v3.23 (версия GCC для микроконтроллеров PIC24F / H и dsPIC30F / 33F.)

Дайте мне знать, если кто-то хочет увидеть источники большего количества файлов. Я не хотел переполнять эту страницу.

Ответы [ 2 ]

6 голосов
/ 19 июля 2010

Если вы включите этот заголовок в более чем 1 .c файл, у вас будет несколько определений.И у вас есть main.c и osd.c.

. .h - это правильное место для функций и extern объявлений данных.Но для переменной вам придется выбрать один из исходных файлов.#defined охранники не меняют это.

Также см. этот вопрос этот ответ описывает стандартный шаблон.

И еще немного объяснений / анализа:

1) Каждый .c исходный файл компилируется независимо .Защитники защищают только от чтения заголовочного файла дважды во время 1 компиляции.

2) Вы получаете ошибку компоновщика (не компилятора).

Когда ваш заголовок определяет переменную, компилятор будет обрабатывать ее как определение в каждом отдельном прогоне.Компоновщик обнаружит несколько экземпляров.

0 голосов
/ 19 июля 2010

Что содержит ваш включаемый файл?

 int video_buff_vis_num;
 extern int video_buff_vis_num;

Первый или второй? Первый не определяет переменную, а выделяет для нее память, а второй просто говорит «где-то есть переменная с таким именем».

У вас должно быть только одно место, где оно выделено, но вы можете иметь много определений.

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