[ovs-dev] [PATCH 1/2] coverage: Reimplement the "ovs-appctl coverage/show" command

Ben Pfaff blp at nicira.com
Tue Aug 27 19:59:49 UTC 2013


On Mon, Aug 26, 2013 at 03:23:16PM -0700, Alex Wang wrote:
> I found answer from here:
> http://stackoverflow.com/questions/337449/how-does-one-declare-an-array-of-constant-function-pointers-in-c
> 
> so if i understand it correctly:
> 
> extern int (*build_assert(void))[1];
> 
> declare an extern function pointer 'build_assert', pointing to a function
> that takes no input argument and returns int[1]. Right?

Not quite.  You can use the "cdecl" program to see what this is:

    blp at sigsegv:~/ovs/_build$ cdecl
    Type `help' or `?' for help
    cdecl> explain extern int (*build_assert(void))[1];
    declare build_assert as extern function (void) returning pointer to array 1 of int
    cdecl> 
    blp at sigsegv:~/ovs/_build$ 

> But I'm still not clear why we must use (*build_assert(void))? I tried to
> change it to normal variable declaration like below:
> /* Build-time assertion for use in a declaration context. */
> #define BUILD_ASSERT_DECL(EXPR) \
> /* Build-time assertion for use in a declaration context. */
> #define BUILD_ASSERT_DECL(EXPR) \
> -        extern int (*build_assert(void))[BUILD_ASSERT__(EXPR)]
> +        extern int build_assert[BUILD_ASSERT__(EXPR)]
> 
> But I got "unused variable" warnings. So, is using "(*build_assert(void))"
> for suppressing the "unused variable" warnings only?

Yes, compilers do not ordinarily warn about functions that are
declared but not called.

The ideas behind BUILD_ASSERT come from gnulib.  You can read the
extensive documentation here:
        http://git.savannah.gnu.org/gitweb/?p=gnulib.git;a=blob;f=lib/verify.h;h=d42d0750ee13f2b1db1274b7db14079b77e8dbef;hb=HEAD
The history of that file is also informative.



More information about the dev mailing list