[질문] 정의되지 않은 extern 함수

태훈의 이미지

리눅스 커널을 분석하고 있습니다. 분석하다가 도저히 이해 안되는 구문이 있네요.

#define per_cpu(var, cpu) (*({                          \
 extern int simple_identifier_##var(void);       \
 RELOC_HIDE(&per_cpu__##var, __per_cpu_offset(cpu)); }))

extern int simple_identifier_##var(void); 함수는 정의 된 곳이 없으며, 커널 소스 다른 코드에서 쓰이는 부분도 없더군요. 그런데 왜 저런 코드를 넣어 두었을까요? 함수를 정의하지 않고 extern 선언만 해둔 심볼을 사용하는 경우가 있나요?

조우철의 이미지

냉무~

태훈의 이미지

per_cpu 매크로 안에

 
extern int simple_identifier_##var(void);       \ 

루틴을 왜 넣었나? 하는것입니다.

per_cpu는 cpu마다 할당되는 변수에 접근할때 사용하는 매크로입니다. 물론 여기저기 많이 사용되죠.
실제 per_cpu 매크로 안에 위의 루틴을 제거해도 동일한 동작을 합니다. 그런데 왜 저런 루틴을 넣었는지...

Just do it!