В 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;
}
Похоже, вам может понадобиться переместить атрибут перед именем функции.
На 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;
}
Следующие работы (g ++ 4.6.3):
class foo
{
public:
void my_func() __attribute__((hot))
{
// Some stuff
}
};
Пример:
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]
Я считаю, что положить атрибут после шаблона<> и раньше любые декораторы по определению функции работали лучше всего. Это компилируется с 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;
}