4.1.19. __weak

이 키워드는 컴파일러가 심볼을 weak로 내보내도록 지시합니다.

__weak 키워드는 함수 및 변수 선언과 함수 정의에 적용할 수 있습니다.

사용법

함수 및 변수 선언

선언의 경우, 이 스토리지 클래스는 extern 개체 선언을 지정합니다. 이 개체 선언은 부재 시에도 링커가 미확인 참조에 잘못 연결하지 않도록 합니다.

예를 들면 다음과 같습니다.

__weak void f(void);
...
f(); // call f weakly

존재하지 않는 weak 함수가 분기 또는 분기 링크 명령어로 컴파일되는 코드에서 참조될 경우 다음과 같은 두 가지 결과가 나타납니다.

  • 참조는 다음 명령어로 분기하는 것으로 확인됩니다. 이로 인해 분기는 NOP가 됩니다.

  • 분기는 NOP 명령어에 의해 교체됩니다.

함수 정의

__weak로 정의된 함수는 심볼을 weak로 내보냅니다. weak로 정의된 함수는 비 weak로 정의된 같은 이름의 함수가 동일한 이미지로 링크되어 있지 않는 한 정상적으로 정의된 함수처럼 동작합니다. 비 weak로 정의된 함수와 weak로 정의된 함수가 동일한 이미지에 있을 경우 모든 함수 호출은 비 weak 함수 호출로 처리됩니다. 여러 개의 weak 정의를 사용할 수 있는 경우 링커에서는 모든 호출에 사용될 하나의 정의를 선택합니다.

__weak로 선언된 함수가 __weak 없이 정의될 경우 비 weak 함수처럼 동작합니다.

제한

함수 및 변수 선언과 함수 정의를 __weak로 정규화하는 경우 제한이 있습니다.

함수 및 변수 선언

함수 또는 변수는 동일한 컴파일에서 weak 또는 비 weak 중 하나로만 사용할 수 있습니다. 예를 들어 다음 코드는 g()h()에서 f()를 weak로 사용합니다.

void f(void);
void g()
{
    f();
}

__weak void f(void);
void h()
{
    f();
}

함수나 변수를 정의하는 동일 컴파일에서 함수나 변수를 weak로 사용할 수는 없습니다. 다음 코드는 h()에서 f()를 비 weak로 사용합니다.

__weak void f(void);
void h()
{
    f();
}
void f() {}

다른 컴파일에서 함수나 변수를 비 weak로 사용하지 않는 한, 링커는 라이브러리에서 함수나 변수를 로드하지 않습니다. 참조가 미확인으로 남아 있으면 해당 값은 NULL로 간주됩니다. 하지만 코드에서 위치 독립적 섹션이나 없는 __weak 함수로 참조될 경우, 미확인 참조는 NULL이 아닙니다.

함수 정의

weak로 정의된 함수는 인라인될 수 없습니다.

예제

 __weak const int c;            // assume 'c' is not present in final link
 const int *f1() { return &c; } // '&c' returns non-NULL if
                                // compiled and linked /ropi

 __weak int i;                  // assume 'i' is not present in final link
 int *f2() { return &i; }       // '&i' returns non-NULL if 
                                // compiled and linked /rwpi

 __weak void f(void);           // assume 'f' is not present in final link
 typedef void (*FP)(void);
 FP g() { return f; }           // 'g' returns non-NULL if 
                                // compiled and linked /ropi

추가 참고

Copyright © 2007 ARM Limited. All rights reserved.ARM DUI 0348AK
Non-Confidential