gcc가 속성의 서명에 기능을 추가합니까? 같은 소스 파일에 있으면 컴파일 될 수 있습니까?Gcc 컴파일러 최적화 기능 인라이닝
void*__attribute__ ((noinline)) GetCurrentIp(void) {
some code...
}
void*GetCurrentIp(void);
void*__attribute__ ((always_inline)) GetCurrentIp(void)
gcc가 속성의 서명에 기능을 추가합니까? 같은 소스 파일에 있으면 컴파일 될 수 있습니까?Gcc 컴파일러 최적화 기능 인라이닝
void*__attribute__ ((noinline)) GetCurrentIp(void) {
some code...
}
void*GetCurrentIp(void);
void*__attribute__ ((always_inline)) GetCurrentIp(void)
아니요. 속성은 서명 기능 추가되지 않습니다, 그래서 당신은 (이 경우 gcc
에서) 가장 큰 이유는 구현의 기능 서명이 언어 (이 경우 C
)의 특징 인 것입니다, 그리고 error: redefinition of 'GetCurrentIp'
받을 수 있습니다 그 표현식에서 그것들을 일치시키는 것을 도울 수 있으니 거기에는 구현 종속성이 없어야합니다. 그리고 속성 (컴파일러가 그 함수를 인라인으로 확장하지 못하도록하는 힌트)은 컴파일러가 원하는대로 코드를 생성하도록하는 지시어입니다. 사실 gcc
에 정의 된 속성은 언어의 특성이 아니기 때문에 등의 의미는이 내용을 포함하거나 제외하여 변경해서는 안됩니다.
속성이 함수 시그니처에 추가되지 않으면 왜 그 오류가 발생합니까? ? 선언문 2 개와 구현 1 개가 아닌가요? –
두 번째 선언은 또 다른 구현 (생각하지 못한 것, 끝 부분)이라고 생각했습니다. 이것이 두 가지 선언 인 경우 코드가 성공적으로 컴파일됩니다. –
... Gcc \ Test \ main.c | 3 | 오류 : always_inline 'GetCurrentIp'에 대한 호출에서 인라이닝하지 못했습니다 : inlinable | 나는 이것이 허용되지 않는다고 생각한다. 제 1 선언의 속성을 본 것 같아요. –
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()
그래서, 속성은 서명의 일부가 아닙니다.
'-fno-inline' gcc 명령 줄 옵션을 사용하여 주어진 파일의 모든 함수에 대해'noinline' 효과를 얻을 수도 있습니다. –