Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

GCC Format attribute not working on function pointer with "using" alias

As the ISO C++ Guidelines recommends, we should use using instead of typedef. However, recently I had to code some debug logging where the attribute would be helpful for compile-time diagnostics.

When I tried applying the using keyword, this did not seem to work:

using logger_cb = void(*)(const char*, va_list) 
__attribute__ ((__format__ (__printf__, 1, 0)));

The error is:

<source>:4:48: error: expected ';' before '__attribute__'
    4 | using logger_cb = void(*)(const char*, va_list) __attribute__ ((__format__ (__printf__, 1, 0))); // <-- uncommenting this won't work
      |                                                ^~~~~~~~~~~~~~
      |                                                ;

However, using typedef it works:

typedef void (*logger_cb)(const char*, va_list) 
__attribute__ ((__format__ (__printf__, 1, 0)));

I cannot figure out if my syntax is wrong or this simply is not supported with the using keyword. Does some guru know about this?

Link to example: https://godbolt.org/z/qWdxWq6Gx

like image 492
SupAl Avatar asked Oct 22 '25 20:10

SupAl


1 Answers

When I tried applying the using keyword, this did not seem to work:

The placement of the optional attribute-specifier-seq must be after the identifier in an alias-declaration. This can be seen from alias declaration:

Alias declarations are declarations with the following syntax:

using identifier attr (optional) = type-id ;  (1)     
template < template-parameter-list >
using identifier attr (optional) = type-id ;  (2)      

attr - optional sequence of any number of attributes

The same can be seen from gram.dcl:

alias-declaration:
using identifier attribute-specifier-seqopt = defining-type-id ; 

This means that the standard way to use using here is as shown below:

using logger_cb [[gnu::format (__printf__, 1, 0) ]] = void(*)(const char*, va_list);

Working demo

like image 97
Anoop Rana Avatar answered Oct 25 '25 10:10

Anoop Rana