[C] define nie widoczny w innych plikach

0

Witam, piszę kod w czystym C. Mam projekt składający się z kilku plików:

abc.c:

#define TBufferData unsigned char
#include "bufor.h"
// reszta kodu...

bufor.h

#ifndef __BUFOR_H
#define __BUFOR_H

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

#ifndef TBufferData
  #warning TBufferData nie zdefiniowane! Automatycznie zostalo ustawione na int
  #define TBufferData int
#endif
// reszta kodu

i chodzi o to że w trakcie kompilacji dostaje warninga:
#warning TBufferData nie zdefiniowane! Automatycznie zostalo ustawione na int

a ten z kolei nie powinien się pojawić. w opcjach kompilatora próbowałem zmieniać priorytety kompilacji tak aby abc.c kompilował się jako pierwszy, jednak to nic nie zmieniło.

I teraz pytanie: Dlaczego w tym pliku nie widać tego define'a?

EDIT:
Znalazłem rozwiązanie, które w pełni mnie nie satysfakcjonuje, ale działa. Define ustawiłem w opcjach kompilatora:
"TBufferData=unsigned char"

jednak teraz, żeby zobaczyć tego defina musze otworzyć opcje kompilatora albo zrobić sobie komentarz na górze kodu, że taki define istnieje.

0

może przez to, że abc includuje bufor, nie odwrotnie?

0

no tak, ale wydawało mi się że include oznacza że treść tego pliku jest wciskana idealnie w to miejsce, a zgodnie z tą ideą to tamten ifndef powinien byc ominięty. poza tym z tego co pamiętam jak pisałem program na avr to też w main.c zawsze definiowałem F_CPU przed include i było to widoczne w tych zainkludowanych plikach

0

a jak wrzucasz wszystko do jednego pliku, bez include, to działa tak jak chcesz?

0
krwq napisał(a)

no tak, ale wydawało mi się że include oznacza że treść tego pliku jest wciskana idealnie w to miejsce, a zgodnie z tą ideą to tamten ifndef powinien byc ominięty. poza tym z tego co pamiętam jak pisałem program na avr to też w main.c zawsze definiowałem F_CPU przed include i było to widoczne w tych zainkludowanych plikach

no dobrze. bufor.h zostaje wciśnięty.
nie ma define'a TBuforData, więc zostaje wyświetlony warning i #define TBuforData int. A potem jeszcze raz #define na uchar...

0

ps. nie wiem z jakeigo kompilatora korzystasz, ale w gcc można zatrzymać kompilację po etapie prekompilacji i zobaczyć co z tego wyszło ;)

0

z gcc, ale nie umiem go obsługiwać z konsoli, ale po tym jak program się zachował to wiem, że w momencie kompilacji bufor.c oraz parsowania (czy jak to sie tam nazywa) bufor.h za wszystkie TBufferData wstawil mi int, a w reszcie plikow unsigned char. Azarien, działa tak jak chcę jak tak robię, tak jak napisałem po edicie jak ustawiam w opcjach kompilatora tego defina to dziala dobrze i tak jak oczekuje.

0

Czy mógłbyś sprowadzić swój kod do postaci SSCCE (http://pscode.org/sscce.html) I zamieścić tutaj?

U mnie wszystko wydaje się działać dokładnie tak, jak powinno. Jaką wersją GCC dysponujesz?

0

wersja 4.41 jakbys nie zauwazyl to w tym kodzie do sscce brakuje jedynie int main() {return 0;}

0

Taki kod (zarówno rozbity na pliki, jak i w jednym pliku) działa u mnie jak powinien, g++ 4.5.2

#define TBufferData unsigned char

#ifndef __BUFOR_H
#define __BUFOR_H

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

    #ifndef TBufferData
      #warning TBufferData nie zdefiniowane! Automatycznie zostalo ustawione na int
      #define TBufferData int
    #endif

#endif

int main() {
    return 0;
}

Chodziło mi raczej o to, żebyś to Ty spróbował te swoje pliki wyczyścić do niezbędnego minimum i je skompilować, być może okazałoby się, że jednak działa i błąd leży gdzie indziej. Jeśli jednak sam już próbowałeś... To nie widzę za bardzo przyczyny poza błędnym działaniem kompilatora, albo może jakichś komplikacji z opcjami kompilatora dorzucanymi przez IDE.

Próbowałeś kompilować to z wiersza poleceń? Albo przeinstalować na czysto kompilator do nowszej (lub nie, jeśli potrzebujesz konkretnie tej) wersji?

1 użytkowników online, w tym zalogowanych: 0, gości: 1