Solomon Candy
Solomon Candy

Reputation: 93

What is making my compiler compile the code despite references to undeclared functions (in headers or otherwise)?

A function, before being used, needs to be declared either in a included header or otherwise (though not a good practice). The header file describes the functions and variables that may be found in a library or an object file and the compiler can create (as of yet) unreferenced symbols to be resolved later whilst linking.

However, my compiler (gcc based toolchain called esp-open-sdk (xtensa CPU)) continues despite finding no reference to a function in the headers and only in the linking stage does the linker intimate of an `undefined reference to <-function-name->'.

Another strange behaviour is that the compiler says nothing if there is no return statement, and the function is not "void".

My question is: What is causing this behaviour? I think it's unlikely but is it some compiler flag?

My compiler flags are:

CFLAGS = -Os -g -O2 -Wpointer-arith -Wundef -Werror -Wl,-EL -fno-inline-functions -nostdlib -mlongcalls -mtext-section-literals -D__ets__ -DICACHE_FLASH

and the linker flags are:

LDFLAGS = -nostdlib -Wl,--no-check-sections -u call_user_start -Wl,-static

Upvotes: 0

Views: 63

Answers (1)

Lundin
Lundin

Reputation: 213842

Probably you use an old version of gcc. Before version 5.x, gcc defaults to a non-standard called "gnu90", which is a non-standard version of the obsolete C90 standard. There is no reason to ever use gnu90 unless you are maintaining some old Linux code. To avoid this, compile with:

-std=c11 -pedantic-errors

-std=c11 meaning you want the compiler to use the current C standard, without involving gnus or other strange animals. -pedantic-errors means that you want it to actually follow the standard and not just pretend to do it.

In order to get the warning for no return from functions, you need to use the option -Wreturn-type, which is included by using -Wall. Always compile with

-Wall -Wextra

Note that "Wall" does not stand for "all warnings", as it leads you to believe. Rather, -Wall means a fistful of warnings and -Wextra means a few warnings more.

Upvotes: 2

Related Questions