일단은 inline 함수가 편리하긴 합니다. 매크로 함수는 한줄(비록 '\'로 연결할 수 있다 하더라도) 안에 다 써야 된다는 제한이 있고, 말씀하신 대로 리턴값을 넘겨야 할 때에도 컴파일러의 특성에 의존해야 합니다. 에러메시지도 inline 쪽이 더 이해하기 쉬운 쪽으로 나오겠죠.
하지만 inline의 구현 방식은 컴파일러에 따라 다릅니다. inline 키워드 자체는 단지 컴파일러에게 이 함수는 빈번히 호출된다는걸 알려주기 위한 힌트일 뿐입니다. 게다가 inline이 붙었다고 해서 항상 인라인 함수로 만들 필요도 업습니다. MSDN에서도 inline에 대해 찾아보면 inline이 쓰인 함수에 대해서 항상 인라인 함수로 만들 필요가 없다고 쓰여 있습니다(거기에 몇몇 경우가 나와 있습니다).
또한 inline 키워드는 C99에서 새로 추가된 키워드입니다. 그 전의 컴파일러라도 자기 자신만의 확장으로 inline을 지원할 수도 있겠습니다만... 어쨌거나 오래된 컴파일러라면 쓰지 못할 가능성도 있습니다.
일단은 inline 함수가 편리하긴 합니다. 매크로 함수는 한줄(비록 '
일단은 inline 함수가 편리하긴 합니다. 매크로 함수는 한줄(비록 '\'로 연결할 수 있다 하더라도) 안에 다 써야 된다는 제한이 있고, 말씀하신 대로 리턴값을 넘겨야 할 때에도 컴파일러의 특성에 의존해야 합니다. 에러메시지도 inline 쪽이 더 이해하기 쉬운 쪽으로 나오겠죠.
하지만 inline의 구현 방식은 컴파일러에 따라 다릅니다. inline 키워드 자체는 단지 컴파일러에게 이 함수는 빈번히 호출된다는걸 알려주기 위한 힌트일 뿐입니다. 게다가 inline이 붙었다고 해서 항상 인라인 함수로 만들 필요도 업습니다. MSDN에서도 inline에 대해 찾아보면 inline이 쓰인 함수에 대해서 항상 인라인 함수로 만들 필요가 없다고 쓰여 있습니다(거기에 몇몇 경우가 나와 있습니다).
또한 inline 키워드는 C99에서 새로 추가된 키워드입니다. 그 전의 컴파일러라도 자기 자신만의 확장으로 inline을 지원할 수도 있겠습니다만... 어쨌거나 오래된 컴파일러라면 쓰지 못할 가능성도 있습니다.
결국 자신이 사용해야 될 컴파일러에서의 inline의 특성에 따라 결정할 일이겠죠.
단순한 call by value의 형태로 짤막한 함수를 만들 때에는 매크
단순한 call by value의 형태로 짤막한 함수를 만들 때에는 매크로 보다 인라인이 보기도 좋고 매크로의 잘못된 사용을 막을 수 있어 좋을 것 같습니다.
하지만 인라인도 잘못쓰면 프로그램 덩치를 키우게 되니 주의가 필요 하겠지요.
STL의 함수자 같은 경우 인라인으로 동작해 알고리즘과 결합시 일반 함수보다 더 나은 성능을 보여준다고 하더군요.
하지만 매크로의 사용을 인라인으로 다 대체 할 수는 없을 것 같습니다.
매크로에는 강력한 Stringizing Operator (#)과 Charizing Operator (#@), Token-Pasting Operator (##) 등이 있으니까요.
또, 매크로엔 조건부 컴파일 기능도 있죠.
매크로는 전처리기에서 처리를 하고, inline 함수는 컴파일시 처리를
매크로는 전처리기에서 처리를 하고, inline 함수는 컴파일시 처리를 하죠. 처리되는 시점이 틀리죠..
주된 차이점은 인라인 함수는 일반함수와 똑같이 사용을 하는거겠죠. 인자에 대한 검사도 할수 있고 리턴 값도 있고.
매크로는 컴파일 전에 치환을 해주는 거고요. 매크로 사용은 주의를 요하죠. 실수를 잘 못찾는 경우도 많죠..
흐음...
모두들 답변감사합니다. ^^
모두들 답변감사합니다. ^^ 인라인함수와 매크로 함수가 gcc컴파일시에 전처리기에 의해서 같은 시점에 컴파일 되는 줄 알았는데.. 아니군요 ..
open source의 그날까지!
시점만 다른것으로 알고있어요~
저도 처리되는 시점만 다르다고 알고 있습니다.
whiterock님께서 말씀하신것처럼 전처리기에서 매크로함수가 처리되고 inline함수는 컴파일시에 call 한 부분에 정의된 부분의 코드가 포함되는것으로 알고 있습니다.
디버깅시...
define은 전처리기에서 처리하기 때문에.. 심볼테이블에서 제외되므로 디버깅시 곤란할 수 있습니다....
댓글 달기