I think this question on StackOverflow might be helpful: https://stackoverflow.com/questions/7090998/portable-unused-parameter-macro-used-on-function-signature-for-c-and-c
The comment by 'the swine' suggests '__pragma(warning(suppress:4100))' to be used for MSVC. I also believe the answer by 'doc_ds' is a nice hint, as he states it is better to use '__attribute__((__unused__))' rather than '__attribute__((unused))' for the case 'unused' might eventually be defined as a macro. With '__unused__' you would be on the safe side as the EDK2 Coding Standard prohibits the usage of one or two underscores as prefix (reserved for compiler usage) for EDK2 macros. The post by Steve-o includes a GNU version check with the macro definition; might that be a good idea? Regards, Marvin. ________________________________________ Von: edk2-devel <[email protected]> im Auftrag von Andrew Fish <[email protected]> Gesendet: Mittwoch, 16. März 2016 18:12 An: Laszlo Ersek Cc: Mike Kinney; [email protected]; Leif Lindholm; Liming Gao Betreff: Re: [edk2] [RFC] MdePkg: add ARG_UNUSED notation to Base.h > On Mar 16, 2016, at 10:06 AM, Laszlo Ersek <[email protected]> wrote: > > On 03/16/16 17:50, Andrew Fish wrote: >> >>> On Mar 16, 2016, at 6:54 AM, Laszlo Ersek <[email protected]> wrote: >>> >>> On 03/14/16 16:38, Leif Lindholm wrote: >>>> To permit many existing platforms to build with -Wunused-parameter, on >>>> GCC and CLANG, the unused parameters need to be annotated as such. >>>> Existing regexp code already uses ARG_UNUSED for this, but it is really >>>> needed across the codebase - so add a version in Base.h. >>>> >>>> Contributed-under: TianoCore Contribution Agreement 1.0 >>>> Signed-off-by: Leif Lindholm <[email protected]> >>>> --- >>>> >>>> This is really the result of a friendly toolchain engineer informing me >>>> CLANG has the -Weverything flag, to actually enable all possible >>>> warnings. >>>> >>>> One problem trying to pick out the real bugs from the just not entirely >>>> clear code is that basically a lot of *LibNull implementations, and >>>> some libraries that should be usable, trip build failures due to unused >>>> parameters. >>>> >>>> MdePkg/Include/Base.h | 9 +++++++++ >>>> 1 file changed, 9 insertions(+) >>>> >>>> diff --git a/MdePkg/Include/Base.h b/MdePkg/Include/Base.h >>>> index 89b2aed..f789094 100644 >>>> --- a/MdePkg/Include/Base.h >>>> +++ b/MdePkg/Include/Base.h >>>> @@ -189,6 +189,15 @@ struct _LIST_ENTRY { >>>> /// >>>> #define OPTIONAL >>>> >>>> +/// >>>> +/// Function argument intentionally unused in function. >>>> +/// >>>> +#if defined(__GNUC__) || defined(__clang__) >>>> + #define ARG_UNUSED __attribute__ ((unused)) >>>> +#else >>>> + #define ARG_UNUSED >>>> +#endif >>>> + >>>> // >>>> // UEFI specification claims 1 and 0. We are concerned about the >>>> // complier portability so we did it this way. >>>> >>> >>> Support for this seems to go back to gcc-4.4: >>> >>> https://gcc.gnu.org/onlinedocs/gcc-4.4.7/gcc/Variable-Attributes.html >>> >>> So it looks safe. (And I agree with the idea.) >>> >> >> I'm confused by the usage, or really when the compiler detects the >> warning? >> >> For example how is this going to work on public interfaces? >> Protocols, PPIs, or library class definitions? There is a single >> definition of the function, but multiple implementations. Some >> implementations may not use some arguments. But what arguments get >> used seems to be an implementation choice and not part of the API? >> Thus it seems like this macro is not going to enable changing >> compiler flags? > > I think this attribute would be used in library instances and protocol > implementations. It would not be used in library class headers nor > protocol definitions. > > Example: > > /* included from library class hdr of protocol def hdr */ > int f(int x); > > /* code in library instance or protocol impl */ > int f(int x __attribute__ ((unused))) > { > return 0; > } > > int main(void) > { > return f(-2); > } > > Compiles silently with > > $ gcc -Wall -Wextra -ansi -pedantic -Werror -o x x.c > > If I remove __attribute__ ((unused)), I get: > > x.c:5:15: error: unused parameter 'x' [-Werror=unused-parameter] > int f(int x) > ^ > cc1: all warnings being treated as errors > OK that makes sense. That is feels like it is going to be a very very large change to the codebase given almost every protocol and PPI member pass the "This" pointer, but may not use it in code. Do we need something for VC++? Thanks, Andrew Fish > Thanks > Laszlo > >> >> Or am I just confused? >> >> Thanks, >> >> Andrew Fish >> >> >>> Acked-by: Laszlo Ersek <[email protected]> >>> _______________________________________________ >>> edk2-devel mailing list >>> [email protected] >>> https://lists.01.org/mailman/listinfo/edk2-devel >> > > _______________________________________________ > edk2-devel mailing list > [email protected] > https://lists.01.org/mailman/listinfo/edk2-devel _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

