|
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.
[Prev in Thread] | Current Thread | [Next in Thread] |