2016-08-03 3 views
0

Есть ли gcc добавить атрибут в качестве функции функции или нет? Будут ли они хорошо скомпилированы, если они находятся в одном исходном файле?Функция оптимизации компилятора Gcc вставка

void*__attribute__ ((noinline)) GetCurrentIp(void) { 
    some code... 
} 


void*GetCurrentIp(void); 
void*__attribute__ ((always_inline)) GetCurrentIp(void) 
+0

Вы также можете использовать параметр командной строки 'gcc'' -fno-inline', чтобы получить эффект 'noinline' для всех функций в заданном файле –

ответ

1

Нет, это не так. Атрибуты не добавляются подписи функции, так что вы будете получать error: redefinition of 'GetCurrentIp'

Основная причина заключается в том, что функция подписи характеристика языка (C в данном случае), а не от реализации (в данном случае gcc), что поможет вам сопоставить их в выражениях, поэтому там не должно быть никакой зависимости от реализации. И атрибуты (как тот, который вы упоминаете, подсказка для компилятора, чтобы никогда не расширять эту встроенную функцию) являются директивами для компилятора для генерации кода по вашему желанию. Действительно, атрибуты, определенные в gcc, не являются характеристикой языка, и как таковое значение программы не должно изменяться путем включения или исключения этих.

+0

Почему я получаю эту ошибку, если атрибуты не добавлены в подпись функции ? Не эти 2 заявления и 1 реализация? –

+0

Я думал, что вторая декларация - это еще одна реализация (вы пропустили, в конце ее). Если это два объявления, код будет скомпилирован успешно. –

+0

... Gcc \ Test \ main.c | 3 | ошибка: inlining не удалось вызвать always_inline 'GetCurrentIp': функция не встроена | Я думаю, что это запрещено. Я думаю, что он смотрит атрибут первой декларации. –

2

Даже если вопрос о C, мы можем позволить g ++ ответить на него (см. Function Names as Strings).

f.C:

#include <stdio.h> 

extern "C" 
void *__attribute__((noinline)) GetCurrentIp(void) 
{ 
    printf("signature of %s: %s\n", __func__, __PRETTY_FUNCTION__); 
    return __builtin_return_address(0); 
} 

int main() 
{ 
    GetCurrentIp(); 
    return 0; 
} 

> g++ f.C 
> a.out 
signature of GetCurrentIp: void* GetCurrentIp() 

Таким образом, атрибут не является частью сигнатуры.