Search
Duplicate
📛

상수(constant)를 직접 정의해 가독성을 높이자

간단소개
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
C
태그
Scrap
8 more properties
여기서 말하는 상수는 정확히는 ‘심볼릭 상수’이다. (리터럴 상수는 직접 정의해서 사용하는 것이 아니니…)
심볼릭 상수(symbolic constant) (기호 상수) 프로그램 실행 중 변할 수 없는, 고정된(constant) 값을 나타내는 기호화 된 상수. 쉽게 얘기해서 특정 상수 값에 변수처럼 이름을 부여한다고 생각하면 된다. 이렇게 특정한 값에 직접 이름을 붙여 사용하면 보다 코드의 가독성을 높일 수 있다.
C언어에서 두 가지 선언 방식이 있다.
1.
변수처럼 선언하여 사용하는 const 상수
2.
전처리기(#define)를 이용하는 매크로 상수
그러나 1번은 줄 수를 잡아먹고(망할 25줄 제한!), 여러 함수에서 범용적으로 쓸 수 있는 전역적인 상수(?)가 아니므로 2번 매크로 상수를 사용한다.
그러나 후술하겠지만 이것도 문제가 있어서 더 확실하게는 enum을…..

매크로 상수 (macro constant)

Norm 규정상 매크로 상수(#define) 직접 정의해서 써도 OK
매크로 함수는 안되니 주의!

매크로 상수 - 문자열(string)

#define MY_STR "This is constant string" 이때 MY_STR은 문자열 상수의 주소값이 된다. printf의 형식지정자 %s, %p로 각각 MY_STR을 출력해보면 쉽게 알 수 있다.
C

enum (열거형) (관련있는 상수 여러개 선언 원할때 특히 유용)

위 이미지처럼 typedef로 별칭을 사용해도 되고 그냥 enum 그 자체로만 써도 된다.
typedef로 별칭을 사용하는 경우, 별칭 앞에는 당연히 t_가 앞에 붙어야 함! (아 뭔가 좀 보기 싫은데)
enum 안에 정의된 값은 대문자로 써도 OK

참고. 정의한 심볼릭 상수와 대응되는 값과의 관계

예를 들어 어떤 소스 코드 맨 상단에다가
#define PENGDORI 153
C
와 같이 매크로 상수를 정의했다고 해보자.
이제 이 소스 코드 내부에서 PENGDORI는 정수값 153와 같다.
그럼 153PENGDORI인가? 그건 아니다.
PENGDORI→153이지만
153PENGDORI는 아니다.
(집합 관계를 떠올려보면 쉽다. 153에 작은 부분집합으로 PENGDORI가 있는 것이다.)
이 차이를 왜 알고 있어야하냐면 같은 값에 대해 매크로 상수를 여러개 정의하는게 유용한 상황이 있을 수 있기 때문이다. 예를 들어,
#define PENGDORI 153 ... #define FAIL_READ 153
C
어떤 함수에서는 각 사람(이름)에게 식별번호를 부여하고 있고 PENGDORI라는 사람에게는 153을 부여했다.
그리고 같은 소스 코드내의 또 다른 함수에서 여러 실행 실패(fail)사유를 각 매크로 상수로 정의하였고 read가 fail한 경우에는 오류 코드번호 153을 사용하기로 했다.
각각 다른 곳에서 값 153을 다른 목적으로 사용하고 있다. 매우 극단적인 상황이지만 무튼 이렇게 하나의 값이 상황에 따라 다르게 인식될 수 있고 코드를 짤때 이 점을 염두해두어야한다.
(이렇게 대응되고 있는 값이 똑같은 매크로 상수를 여럿 정의해 사용할때는, 당연히 해당 용도에 맞는 매크로 상수만 사용해야할 것이다. 함수 실행 실패 사유를 PENGDORI로 줄 수는 없지 않은가?)