Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


 
Опции темы
Непрочитано 12.07.2013, 09:23  
Flopix
Гражданин KAZUS.RU
 
Регистрация: 31.12.2010
Сообщений: 837
Сказал спасибо: 371
Сказали Спасибо 153 раз(а) в 113 сообщении(ях)
Flopix на пути к лучшему
По умолчанию Нубовопрос по препроцессору GCC

Используется среда CoCoox, компилятор GCC (Си)

Что то я запутался в препроцессоре, а точнее в работе с #include. Помогите разобраться. Создал для теста пустой проект. Листинг ниже.

main.h
PHP код:

#define testdef 

main.c
PHP код:

#include "main.h"
#include "func.h"

#ifndef testdef
    #error testdef not def
#endif

int main(void)
{

    while(
1)
    {

    }


func.h
PHP код:

#ifndef testdef
    #error testdef not def
#endif 
func.c
PHP код:

#include "func.h"

#ifndef testdef
    #error testdef not def
#endif 


При компиляции получаю следущее
[cc] Parsing ..\..\..\main.c
[cc] Parsing ..\..\..\func.h
[cc] 0 files are up to date.
[cc] 2 total files to be compiled.
[cc] 1 files to be recompiled from dependency analysis.
[cc] arm-none-eabi-gcc -mcpu=cortex-m4 -mthumb -Wall -ffunction-sections -g -O0 -c -DSTM32F407VG -DSTM32F4XX -IC:\CooCox\CoIDE\workspace -IC:\CooCox\CoIDE\workspace\testinclude -IC:\CooCox\CoIDE C:\CooCox\CoIDE\workspace\testinclude\main.c C:\CooCox\CoIDE\workspace\testinclude\func.c
[cc] In file included from C:\CooCox\CoIDE\workspace\testinclude\func.c:1:0:
[cc] C:\CooCox\CoIDE\workspace\testinclude\func.h:2:2: error: #error testdef not def
[cc] C:\CooCox\CoIDE\workspace\testinclude\func.c:4:3: error: #error testdef not def



Вопрос в следующем. Почему идентификатор testdef не доступен хотя бы в файле func.h ведь препроцессор при директиве #include "func.h" вставляет его текст непосредственно в листинг. А 2мя строчками ниже в main.c этот идентификатор доступен. Что я упустил?


Кстати если в main.c заменить #include "func.h" на #include "func.c" то в func.c testdef оказывается доступной.
Реклама:

Последний раз редактировалось Flopix; 12.07.2013 в 09:26.
Flopix вне форума  
Непрочитано 12.07.2013, 10:00  
tempora
Почётный гражданин KAZUS.RU
 
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
tempora на пути к лучшему
По умолчанию Re: Нубовопрос по препроцессору GCC

Сообщение от Flopix Посмотреть сообщение
Что я упустил?
А самому выполнить подстановку и посмотреть, что выйдет? Там же всего три строчки...

В func.c получится вот такая последовательность:
Код:
//#include "func.h"
#ifndef testdef
    #error testdef not def
#endif

#ifndef testdef
    #error testdef not def
#endif
Ну, и как же ей не кричать об ошибке?

Сообщение от Flopix Посмотреть сообщение
Кстати если в main.c заменить #include "func.h" на #include "func.c" ...
То в main.c окажутся копии всех функций, определенных в func.c. То-то линкер обрадуется!
__________________
There's always more than one way to skin a cat.
tempora вне форума  
Сказали "Спасибо" tempora
Flopix (12.07.2013)
Непрочитано 12.07.2013, 10:22  
Flopix
Гражданин KAZUS.RU
 
Регистрация: 31.12.2010
Сообщений: 837
Сказал спасибо: 371
Сказали Спасибо 153 раз(а) в 113 сообщении(ях)
Flopix на пути к лучшему
По умолчанию Re: Нубовопрос по препроцессору GCC

Ну хорошо а тут



PHP код:


//#include "main.h"
#define testdef



//#include "func.h"
#ifndef testdef
    #error testdef not def
#endif
//тут то что не так?


#ifndef testdef
    #error testdef not def
#endif

int main(void)
{

    while(
1)
    {

    }

Flopix вне форума  
Непрочитано 12.07.2013, 10:27  
eddy
Почётный гражданин KAZUS.RU
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,581
Сказал спасибо: 115
Сказали Спасибо 806 раз(а) в 583 сообщении(ях)
eddy на пути к лучшему
По умолчанию Re: Нубовопрос по препроцессору GCC

Flopix, ну прочтите же вы сначала K&R! Си — не тот случай, когда можно "нахрапом изучить".

Запустите gcc -E, да посмотрите, что на выходе препроцессора получается!
__________________
Смерть бандеровской мразоте!
eddy вне форума  
Сказали "Спасибо" eddy
Flopix (12.07.2013)
Непрочитано 12.07.2013, 10:39  
tempora
Почётный гражданин KAZUS.RU
 
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
tempora на пути к лучшему
По умолчанию Re: Нубовопрос по препроцессору GCC

Сообщение от Flopix Посмотреть сообщение
Ну хорошо а тут ... тут то что не так?
А кто сказал, что тут что-то не так? Откуда такая мысель?
__________________
There's always more than one way to skin a cat.
tempora вне форума  
Непрочитано 12.07.2013, 11:10  
Flopix
Гражданин KAZUS.RU
 
Регистрация: 31.12.2010
Сообщений: 837
Сказал спасибо: 371
Сказали Спасибо 153 раз(а) в 113 сообщении(ях)
Flopix на пути к лучшему
По умолчанию Re: Нубовопрос по препроцессору GCC

Сообщение от tempora Посмотреть сообщение
А кто сказал, что тут что-то не так? Откуда такая мысель?
отсюда
[cc] C:\CooCox\CoIDE\workspace\testinclude\func.h:2:2: error: #error testdef not def

Или препроцессор обрабатывает отдельно каждый *.с файл с его инклюдами?


По поводу func.c понятно, то больше для теста. А вот по поводу заголовочных файлов и пошел сыр-бор.

Последний раз редактировалось Flopix; 12.07.2013 в 11:23.
Flopix вне форума  
Непрочитано 12.07.2013, 11:21  
Flopix
Гражданин KAZUS.RU
 
Регистрация: 31.12.2010
Сообщений: 837
Сказал спасибо: 371
Сказали Спасибо 153 раз(а) в 113 сообщении(ях)
Flopix на пути к лучшему
По умолчанию Re: Нубовопрос по препроцессору GCC

Сообщение от eddy Посмотреть сообщение
Flopix, ну прочтите же вы сначала K&R! Си — не тот случай, когда можно "нахрапом изучить".

Запустите gcc -E, да посмотрите, что на выходе препроцессора получается!
Спасибо буду читать. У меня есть кгина Шилдта. Основы С++. Вот в ней ровным счетом ничего не сказано про области видимости макроопределений.
Flopix вне форума  
Непрочитано 12.07.2013, 11:29  
eddy
Почётный гражданин KAZUS.RU
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,581
Сказал спасибо: 115
Сказали Спасибо 806 раз(а) в 583 сообщении(ях)
eddy на пути к лучшему
По умолчанию Re: Нубовопрос по препроцессору GCC

Сообщение от Flopix Посмотреть сообщение
Или препроцессор обрабатывает отдельно каждый *.с файл с его инклюдами?
Ясен пень! Каждый сишный файл компилируется в отдельный объектный файл. А затем они вместе линкуются!
Цитата:
У меня есть кгина Шилдта. Основы С++.
С++ != C! Не надо пытаться по этой книжке Си выучить!
__________________
Смерть бандеровской мразоте!
eddy вне форума  
Сказали "Спасибо" eddy
Flopix (12.07.2013)
Непрочитано 12.07.2013, 11:30  
Flopix
Гражданин KAZUS.RU
 
Регистрация: 31.12.2010
Сообщений: 837
Сказал спасибо: 371
Сказали Спасибо 153 раз(а) в 113 сообщении(ях)
Flopix на пути к лучшему
По умолчанию Re: Нубовопрос по препроцессору GCC

eddy, спасибо. Теперь все ясно.
Flopix вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Плоттер GCC Puma II-60 Hurricane80 Ремонт оргтехники 5 04.12.2013 08:50
Yagarto GCC объявить массив по определенному адресу svad0 Микроконтроллеры, АЦП, память и т.д 4 13.01.2012 19:49
gcc, iar, code vision AVR ? schotki Микроконтроллеры, АЦП, память и т.д 48 26.05.2009 20:15
Настройки gcc ARM под windows __djan_ Микроконтроллеры, АЦП, память и т.д 7 28.03.2009 02:49
Как организовать тип String в GCC? IgorAVR2 Микроконтроллеры, АЦП, память и т.д 2 17.03.2008 23:57


Часовой пояс GMT +4, время: 15:50.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot