bug-ddrescue
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Bug-ddrescue] [PATCH 3/5] io: Add missing prototype


From: Antonio Diaz Diaz
Subject: Re: [Bug-ddrescue] [PATCH 3/5] io: Add missing prototype
Date: Mon, 05 Aug 2019 22:24:41 +0200
User-agent: Mozilla/5.0 (X11; U; Linux i586; en-US; rv:1.9.1.19) Gecko/20110420 SeaMonkey/2.0.14

Rosen Penev wrote:
+extern "C" void sighandler( int signum );
    extern "C" void sighandler( int signum )
      { if( signum_ == 0&&    signum>    0 ) signum_ = signum; }

There is nothing missing here. A function definition is a function
declaration in which the body of the function is presented. Therefore
there is no need to declare the function twice.

My understanding here is that this function needs to be static or
declared separately. static cannot be used with extern so I went for
the other option.

Why does it need to be static or declared separately? I can see nothing
in the C++ standard requiring that. AFAICT, all that is required is that
the function is declared before being used, and a definition is also a
declaration.

In the case of static, it's a huge help to the compiler in terms of
figuring out if the function is used only in the file and as a result,
inlining the function which reduces the overall size.

But this function can't be inlined because it is a signal handler whose address must be passed to sigaction.

-Wmissing-prototypes is not valid for C++ but is valid for C.

But the fact that 'sighandler' has "C" linkage does not turn the whole file into C. The C++ standard applies.

-Wmissing-prototypes is not valid for C++ but is valid for C. From the GCC docs:

Warn if a global function is defined without a previous prototype
declaration. This warning is issued even if the definition itself
provides a prototype. Use this option to detect global functions that
do not have a matching prototype declaration in a header file. This
option is not valid for C++ because all function declarations provide
prototypes and a non-matching declaration declares an overload rather
than conflict with an earlier declaration. Use -Wmissing-declarations
to detect missing declarations in C++.

And just below that:

'-Wmissing-declarations'
Warn if a global function is defined without a previous declaration. Do so even if the definition itself provides a prototype. Use this option to detect global functions that are not declared in header files. In C, no warnings are issued for functions with previous non-prototype declarations; use '-Wmissing-prototypes' to detect missing prototypes. In C++, no warnings are issued for function templates, or for inline functions, or for functions in anonymous namespaces.

Note that 'sighandler' is inside an anonymous namespace.


Best regards,
Antonio.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]