Definitions in the standard are coherent; your attempt to interpret them is not completely consistent.
ISO / IEC 9899: 2011 (C11) states (quoting a little more material from 7.1.4 and breaking parts of one large paragraph into several):
Each of the following statements applies, unless explicitly stated otherwise in the detailed description that follows: ...
Any function declared in the header can be additionally implemented as a functionally similar macro defined in the header, therefore, if the library function is declared explicitly when the header is enabled, you can use one of the methods shown below to ensure such a macro does not affect ad.
Any macro definition of a function can be suppressed locally by entering the name of the function in parentheses, because the left bracket does not follow this name, which indicates the extension of the name of the macro function function. For the same syntactic reason, it is permitted to take the address of a library function, even if it is also defined as a macro. 185) Using #undef to remove any macro definition will also ensure that the actual function is mentioned.
Any call to a library function that is implemented as a macro must be expanded to a code that evaluates each of its arguments exactly once, completely protected by brackets, where necessary, therefore it is generally safe to use arbitrary expressions as arguments. 186) Similarly, these functionally similar macros described in the following subsections can be called in an expression where a function with a compatible return type can be called. 187)
185) This means that an implementation must provide an actual function for each library function, even if it also provides a macro for that function.
186) Such macros may not contain sequence points that make the corresponding function calls.
187) Because external identifiers and some macro names starting with an underscore are reserved, implementations may provide special semantics for such names. For example, the identifier _BUILTIN_abs can be used to indicate the generation of inline code for the abs function. Thus, the corresponding heading can indicate
#define abs(x) _BUILTIN_abs(x)
for a compiler whose code generator will accept it. Thus, a user who wants to ensure that a given library function, such as abs , is a genuine function, can write
#undef abs
whether the implementation header provides an abs macro implementation or an inline implementation. Thus, the prototype of the function, preceding and hidden by any macro definition, is also disclosed.
Note the contents of footnote 185 in particular.