살군의 보조기억 장치

Another memory device…

함수 시그너처에서 변수명이 생략된 경우

with one comment

여기에서 한 번 언급했던 내용인 함수 시그너처signature 가운데 매개변수parameter가 생략 혹은 주석처리된 경우를 본 적이 있는가? 물론 컴파일이 된다. 되니까 이야기를 시작한 것이지. 단, c++에서만. c에서는 컴파일이 안된다.

여기에 대해 궁금하게 된 이유는 이제 opencv test code 를 만들어 볼려고 이미 잘 작성된 기존 테스트코드를 살펴보다가 발견했다. 아래 코드를 보면,

class Core_ArrayOpTest : public cvtest::BaseTest
{
public:
    Core_ArrayOpTest();
    ~Core_ArrayOpTest();
protected:
    void run(int);
};

//...

void Core_ArrayOpTest::run( int /* start_from */)
{
    //...
}

line:7에서는 선언부이므로 생략하는 것이 문제가 없지만, 일반적으로 line:12의 정의부에서는 매개변수 이름을 생략하는 것이 일반적이지는 않다. stackoverflow를 찾아보니 당연히 누군가가 질문을 했었고 몇가지 쓸데없는 언쟁(?)도 있고 답도 있다.

정리하면, 매개변수 이름이 생략되는 것은 c++ 표준에서 허용하고 있으니까 이건 괜찮지만, c의 경우에는 c99 표준에서 명시적으로 허용하지 않기 때문에 매개변수 이름을 생략하지 못한다. 흠… 표준에서 정한 것이니 할말은 없다. 그치만 왜 이렇게 허용을 했을까?

일반적인 사용의 예는 위의 코드에서처럼 인터페이스에서 어떤 목적으로 함수에 매개변수가 필요하다고 선언을 했지만, 실제 구현시에 매개변수명을 주석처리해 놓고 있다. 이름을 주석처리했으니 구현한 함수 내에서는 매개변수를 사용할 수가 없다. 즉, 이 인터페이스를 구현한 다른 함수에서는 필요하지만 이 함수에서는 사용하지 않을 경우 이렇게 주석으로 처리한다. 이렇게 하면 컴파일러에서 unused warning 도 발생하지 않는다. 아마도 이런 이유 때문에 c++에서는 이 방식을 허용한 것이 아닌가 추측된다.

참고
Advertisements

Written by gomiski

2014/02/26 at 7:42 am

One Response

Subscribe to comments with RSS.

  1. […] 순수가상함수 write() 가 구현되어있다. 함수의 시그너처가 생략된 것은 이전글을 참고하자. 여기서는 별로 볼 것이 없다. 그냥 writeMat() 함수가 다시 […]


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: