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

'-fno-inline' gcc 명령 줄 옵션을 사용하여 주어진 파일의 모든 함수에 대해'noinline' 효과를 얻을 수도 있습니다. –

답변

1

아니요. 속성은 서명 기능 추가되지 않습니다, 그래서 당신은 (이 경우 gcc에서) 가장 큰 이유는 구현의 기능 서명이 언어 (이 경우 C)의 특징 인 것입니다, 그리고 error: redefinition of 'GetCurrentIp'

받을 수 있습니다 그 표현식에서 그것들을 일치시키는 것을 도울 수 있으니 거기에는 구현 종속성이 없어야합니다. 그리고 속성 (컴파일러가 그 함수를 인라인으로 확장하지 못하도록하는 힌트)은 컴파일러가 원하는대로 코드를 생성하도록하는 지시어입니다. 사실 gcc에 정의 된 속성은 언어의 특성이 아니기 때문에 등의 의미는이 내용을 포함하거나 제외하여 변경해서는 안됩니다.

+0

속성이 함수 시그니처에 추가되지 않으면 왜 그 오류가 발생합니까? ? 선언문 2 개와 구현 1 개가 아닌가요? –

+0

두 번째 선언은 또 다른 구현 (생각하지 못한 것, 끝 부분)이라고 생각했습니다. 이것이 두 가지 선언 인 경우 코드가 성공적으로 컴파일됩니다. –

+0

... Gcc \ Test \ main.c | 3 | 오류 : always_inline 'GetCurrentIp'에 대한 호출에서 인라이닝하지 못했습니다 : inlinable | 나는 이것이 허용되지 않는다고 생각한다. 제 1 선언의 속성을 본 것 같아요. –

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() 

그래서, 속성은 서명의 일부가 아닙니다.