헤더의 매크로 대 정적 함수


9

함수를 사용할 수있는 많은 빠른 작업을 위해 f(x,y)일반 C에서는 매크로가 사용됩니다. 함수 호출 (즉, 임의 코드의 코드 확장이 아닌 함수 인라인에 사용되는 매크로)으로 해결할 수있는 이러한 경우에 대해 구체적으로 묻고 싶습니다.

일반적으로 C 함수는 다른 C 파일에서 링크 될 수 있으므로 인라인되지 않습니다. 그러나 정적 C 함수는 정의 된 C 파일 내에서만 볼 수 있습니다. 따라서 컴파일러에서 인라인 할 수 있습니다. 더 안전한 코드를 생성하기 때문에 많은 매크로를 정적 함수로 바꾸어 대체해야한다고 들었습니다.

이것이 좋은 생각이 아닌 경우가 있습니까?

다시 : 함수로 표현할 수없는 ## 같은 구성을 가진 Code-Production 매크로에 대해서는 묻지 않습니다.



적절한 매크로를 작성하는 것은 고통 inline스럽고 ing 함수는 바이너리에서 여러 번 정의 할 수 있도록 보장합니다. 컴파일러는 공간을 절약하기 위해 실제로 인라인할지 여부를 결정할 수 있습니다.
ratchet freak

2
나는 실제로 이것들 대부분이 역사적인 이유라고 생각합니다. 오래 전에 C 컴파일러는 함수를 전혀 인라인하지 않았습니다. 그래서 사람들은 매크로를 인라인으로 원하는 것에 사용했습니다. C 코드는 일반적으로 비정상적으로 오래 지속됩니다.
Jan Hudec

@ratchetfreak : C에는 없습니다 inline. 이것은 C ++에 관한 것이 아닙니다.
wirrbel

2
@wirrbel 물론 inlineC99부터는 C99 이후로 존재합니다. 빠른 개요 는 인라인 함수에 대한 Wikipedia를 참조하십시오 .
amon

답변:


6

함수 호출로 해결할 수있는 매크로에는 많은 함정이 있습니다.

  • 와 같은 인수를 올바르게 처리해야하기 때문에 쓰기가 어렵습니다 ++i.
  • 매크로를 거치거나 중단 점을 넣을 수 없으므로 시각적 디버거로 디버깅하기가 어렵습니다.
  • 컴파일 종속성을 분석 할 때 올바르게 처리하기가 어렵습니다.

함수 호출로 해결할 수있는 매크로는 기본 컴파일러에서 인라인을 제공하는 데 유용했을 수 있습니다. 인라인 함수를 처리하지 않는 컴파일러는 알지 못하고 일부는 컴파일 단위에서 인라인 할 수 있습니다.

일반적으로 C 함수는 다른 C 파일에서 링크 될 수 있으므로 인라인되지 않습니다.

컴파일러가 전통적인 버전 callinlined 버전의 두 가지 버전의 함수를 제공 할 수없는 이유는 없습니다 . 대상으로하는 컴파일러의 설명서를 봐야합니다. 또한 생성 된 어셈블리를보고 싶을 수도 있습니다. 어셈블리를 모르더라도 일부 기능이 인라인되었는지 여부를 빠르게 알 수 있습니다. (아기 예부터 시작하여 빨리 배우십시오.)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.