атрибуты gcc с методами C ++

В GCC с методом C ++, определенным в заголовочном файле, возможно ли использовать атрибут синтаксис? Может кто-нибудь привести пример для меня, пожалуйста. Следующий код не работает:

class foo
{
public:
void my_func() __attribute__((hot));
void my_func()
{
// Some stuff
}
};

Кажется, что вы должны поместить атрибуты в объявление, а не в определение функции. Когда вы определяете метод / функцию в заголовочном файле, у вас нет отдельной декларации.

Также, как использовать это с шаблонами. Например, следующий код не может быть скомпилирован с ошибкой: атрибуты недопустимы в определении функции.

/// Template version of max for type T
template <typename T>
inline T max(const T x, const T y) __attribute((const))
{
if (x > y)
return x;
else
return y;
}

9

Решение

Похоже, вам может понадобиться переместить атрибут перед именем функции.
На GCC 4.6.3 ваш код не компилируется, но код компилируется ниже.

template <typename T>
inline T __attribute__((const)) max(const T x, const T y)
{
if (x > y)
return x;
else
return y;
}
6

Другие решения

Следующие работы (g ++ 4.6.3):

class foo
{
public:
void my_func() __attribute__((hot))
{
// Some stuff
}
};
  • Вы не должны использовать отдельную декларацию
  • Вы должны удалить заключительные подчеркивания как упомянуто @Joachim

Пример:

class foo {
public:
void my_func() __attribute__((deprecated)) {
}

void my_func2() __attribute__((noinline)) {
}
};

int main() {
foo f;
f.my_func();
f.my_func2();
return 0;
}
$ g++ -c -Wall -pedantic a.cpp
a.cpp: In function int main():
a.cpp:12:13: warning: void foo::my_func() is deprecated (declared at a.cpp:3) [-Wdeprecated-declarations]
1

Я считаю, что положить атрибут после шаблона<> и раньше любые декораторы по определению функции работали лучше всего. Это компилируется с arm gcc и arm clang вместе с MacOS clang. И мне больше не нужны отдельные декларации. Это был также мой единственный вариант с шаблонной функцией шаблонного класса, использующей arm gcc.

Это работало внутри и снаружи класса с шаблонами и без них.

class foo {
public:
__attribute__((pure)) void my_func()
{
// Some stuff
}
template <typename T>
__attribute__((pure)) void my_func(T t)
{
// Some stuff
}
};

template <typename T>
__attribute((const)) inline T max(const T x, const T y) {
if (x > y)
return x;
else
return y;
}
0
По вопросам рекламы [email protected]