GCC предоставляет эти атрибуты в соответствии со стандартным синтаксисом атрибута , представленным в C ++ 11:
[[gnu::const]] // or [[gnu::pure]]
void foo(int x);
Начиная с C ++ 17, компиляторы обязаны игнорировать неизвестные атрибуты без неговызывая ошибку. На практике компиляторы часто предупреждают о неизвестных атрибутах (с возможностью отключить это предупреждение, конечно). Из того, что я видел в Compiler Explorer и из того, что я помню, компиляторы старше C ++ 17 также обычно предупреждают, когда они вообще понимают синтаксис. Основной компилятор, который я бы дополнительно протестировал, - это MSVC, но Compiler Explorer не слишком далеко заходит в версиях MSVC.
Если у вас уже есть макрос и вы не хотите изменять все его применения, вы можете работатьэто в:
#define ATTRIBUTE(an_attribute) [[gnu::an_attribute]]
Если это не разумное решение, я подозреваю, что вам, к сожалению, придется проверять конкретные компиляторы и версии в состоянии.