문제 상황
프로그램을 짜던 중 배열의 크기가 자주 사용될 것 같아 전역 변수로 상수 변수값인'const int NUMBER_IN_ARRAY = 5'를 선언했다.
그리고 main함수 내에서 배열을 선언할 때 그 크기 값을 NUMBER_IN_ARRAY로 지정했다.
컴파일을 하니 바로 컴파일 에러가 났다.(variable-sized object may not be initialized)
왜 배열을 선언할 때 상수 변수값을 크기로 지정할 수 없을까?
원인 파악
우선 배열의 선언 방법을 다시 알아봐야 한다.
C/C++에서 배열은 선언할 때 크기가 지정되어야 한다. 이때 대괄호 []를 사용하는데, 크기는 고정된 상수여야 하며 변수는 사용할 수 없다.
내가 사용한 const int도 결국 초기값을 변경할 수 없는 변수다. 컴파일 시 이 변수가 상수값으로 인식되지 않아 에러가 발생한 것이다.
해결방법
꼭 바깥에서 배열의 크기를 선언하고 싶다면 #define을 사용하는 방법이 있다.
#define은 매크로를 만드는 전처리기 명령어다. 매크로는 컴파일 과정인 전처리기 - 컴파일러 - 어셈블러 - 링커 중 전처리 단계에서 #define으로 정의된 상수 등을 확장 문자열로 변환시킨다. 데이터 타입을 지정할 수 없고 그래서 메모리를 차지하지 않는다는 점이 const와의 차이다.
매크로 상수로 #define을 사용할 때는 다음을 따른다.
#define CNAME value
또는
#define CNAME (expression)
여기서 CNAME은 상수의 이름이다. 필수는 아니지만, 많은 C 프로그래머들은 상수값을 대문자로 정의한다. 상수에 식이 할당된다면 이는 괄호로 묶어줘야 한다.
결과
#define으로 NUMBER_IN_ARRAY를 정의하니 프로그램이 정상적으로 컴파일되었다.
생각
검색을 하다 보니 #define을 사용하면 속도가 빠르지만 큰 단점이 있다고 한다. 전처리기에서 값을 치환해버리기 때문에 컴파일러에서는 CNAME을 인식하지 못한다는 것이다. 처음 보는 방대한 양의 코드에서 매크로 상수 때문에 컴파일 에러가 나면 찾기 어렵다고 한다. 변수 하나를 선언할 때도 고려할 점이 참 많구나. 공부할 것 투성이다.
그래도 궁금한 것을 검색해보고 새로운 개념을 배우니 뿌듯하다😊
문제 해결에 있어 네이버 CS50 코칭 스터디 2기 WANNTE코치님께 도움을 받았다. #define의 syntax와 관련된 내용은 아래 사이트에서 가져왔다.
'Programming > C' 카테고리의 다른 글
C 언어 | 포인터 (0) | 2021.02.19 |
---|---|
C 언어 | 메모리 주소 (0) | 2021.02.19 |
C 언어 | 명령행 인자 (0) | 2021.02.02 |
C 언어 | 문자열의 활용 (0) | 2021.02.02 |
C 언어 | 문자열과 배열 (0) | 2021.02.02 |