C에서의 typedef는 단지 특정 형식에 대해 별칭을 만드는 것 뿐이었다. 따라서 다음과 같은 코드는 컴파일 에러가 발생했다.

typedef int HANDLE;

int foo(int);
int foo(HANDLE);

하지만 D에는 C의 typedef에 해당하는 alias라는 키워드가 존재한다. 물론 완전히 같은 기능은 아니다. alias는 타입에 대한 것 뿐 아니라 네임스페이스, 변수 등 모든 심볼에 대해 사용이 가능하다. 우선 C와 D의 typedef 키워드가 어떻게 다른지 명백하게 보여주는 샘플 코드를 보기로 하자.

import std.stdio;

typedef int INT; // int에 대해 typedef를 사용했다.

int main(string[] argv)
{
	writefln("foo(int) = %d, foo(INT) = %d", foo(2), foo(cast(INT)2));
	readln(); //키보드 입력을 기다린다.
	return 0;
}

int foo(int i) //D는 전방선언이 필요하지 않다.
{
	return i ^^ 2; //pow연산자이다. i의 2제곱.
}

int foo(INT i) //오버로딩된다.
{
	return 0;
}


D에서는 위와 같이 int를 typedef한 INT라는 타입을 int와는 별개의 타입으로 취급한다. 따라서 오버로딩이 가능해진다. 위 샘플에서는 foo(INT)를 호출하기 위해 2를 INT타입으로 캐스팅했다. 위 코드에서 typedef를 alias로 바꿔 보자.

만약 해당 함수들에 대한 호출이 없었다면 일단 컴파일러는 에러를 내지 않는데, 링커에 가서 기존에 정의된 심볼이라는 내용의 에러가 뜨게 된다. DMD는 일단 시그니처가 같더라도 에러로 취급하지 않는 것으로 보인다. 이 부분은 조금 문제가 있어 보이기도 하지만, 호출이 존재하면 지정된 시그니처에 해당하는 함수가 여러 개 매칭된다는 내용의 에러가 컴파일시 뜨게 된다.


보다 나아가서, 결론적으로:
typedef는 D2에서 deprecated다.
Tag //