I am having trouble understanding how these macros I see in header files work. I looked back into my texts and understand basic macro operations but I do not understand this.

I understand line 8: replace NORETURN with __attribute__ ((__noreturn__)).

But line 10 just defines the word.

Then what is the point of NORETURN at the end of a function argument list?

This is an excerpt from Linux Programming Interface by Michael Kerrisk
page 52. Header file is error_functions.h

Code:
#ifndef ERROR_FUNCTIONS_H
#define ERROR_FUNCTIONS_H

void errMsg(const char *format, ...);

#ifdef __GNUC__

#define NORETURN __attribute__ ((__noreturn__))
#else
#define NORETURN
#endif

void errExit(const char *format, ...) NORETURN;

void errExit(const char *format, ...) NORETURN;
void err_exit(const char *format, ...) NORETURN;
....
void fatal(const char *format, ...) NORETURN;

...........