Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Macro defined in main.c not visible in another included file

I have multiple C and H files

In main.c I defined a macro, and in ws_driver.c I want to use it.

ws_driver.h is included in main.c.

main.c

#define WS_PORT PORT_D8
#define WS_BIT D8
#define WS_DDR DDR_D8

#include "ws_driver.h"

In ws_dirver.c I have two checks:

ws_driver.c

#include "ws_driver.h"

#ifndef WS_PORT
# error "WS_PORT not defined!"
#endif

#ifndef WS_BIT
# error "WS_BIT not defined!"
#endif

Both are failing.

$ avr-gcc -std=gnu99 -mmcu=atmega328p -DF_CPU=16000000UL -Os -I. -I -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wno-main -Wno-strict-prototypes -Wno-comment -g2 -ggdb -ffunction-sections -fdata-sections -Wl,--gc-sections -Wl,--relax -std=gnu99 main.c  ws_driver.c --output main.elf
ws_driver.c:10:3: error: #error "WS_PORT not defined!"
 # error "WS_PORT not defined!"
   ^
ws_driver.c:14:3: error: #error "WS_BIT not defined!"
 # error "WS_BIT not defined!"
   ^
ws_driver.c: In function 'ws_show':
ws_driver.c:23:20: error: 'WS_PORT' undeclared (first use in this function)
 #define bus_low() (WS_PORT) &= ~(1 << WS_BIT)
                    ^
ws_driver.c:37:2: note: in expansion of macro 'bus_low'
  bus_low();
  ^
ws_driver.c:23:20: note: each undeclared identifier is reported only once for each function it appears in
 #define b......

What am I doing wrong? Please ask if you want to see some other part of the code.

like image 501
MightyPork Avatar asked Dec 13 '14 23:12

MightyPork


1 Answers

You have to define the macros in a header file, not in the .c file if you want to use them in multiple places.

When the compiler compiles ws_driver.c it only includes ws_driver.h and the macro is not there. It does not include main.c. Each .c file is compiled separately.

Move the macro definitions in say config.h and include it everywhere you need it.

You can also use the compiler's define -DWS_BIT=123 -DOTHER=SMTH. The value you pass will be in the generated object file and can not be changed without recompiling.

If you want to compile only once, then pass these as parameters or create a configure_my_library() function...

like image 61
Doncho Gunchev Avatar answered Sep 24 '22 10:09

Doncho Gunchev