C++에서 const 와\#define 의 장단 점 분석
4981 단어 const#define이 로 움 과 폐단
\#define MAX 255 로 정 의 된 상수 가 유형 이 없습니다.즉시 수 를 보 여 줍 니 다.컴 파일 러 는 정 의 된 상수 값 을 정 의 된 상수 의 이름과 연결 시 킬 뿐 define 이 정의 하 는 매크로 변 수 는 미리 처리 할 때 교체 합 니 다.프로그램 에서 이 상수 에 사용 할 때 복사 하여 교체 합 니 다.
const float MAX=255;정 의 된 상수 에는 형식 이름 이 있 습 니 다.메모리 의 정적 영역 에 저 장 됩 니 다.프로그램 이 실행 되 는 과정 에서 const 변 수 는 하나의 복사 만 있 고\#define 이 정의 하 는 매크로 변 수 는 여러 개의 복사 가 있 기 때문에 매크로 정 의 는 프로그램 이 실행 되 는 과정 에서 소모 하 는 메모리 가 const 변수 보다 훨씬 큽 니 다.
define 로 정 의 된 상수 는 포인터 변수 로 가리 킬 수 없습니다.const 로 정 의 된 상수 는 포인터 로 이 상수 의 주 소 를 가리 킬 수 있 습 니 다.
define 으로 간단 한 함 수 를 정의 할 수 있 습 니 다.const 는 함 수 를 정의 할 수 없습니다.
const 와\#define 의 장단 점 을 유도 하여 const 의 의 미 를 유도 합 니 다.
const 와\#define 은 모두 비슷 한 기능 을 가지 고 있 습 니 다.그것 은 바로'상수'를 정의 하 는 것 입 니 다.
\#define 에서 상수 정 의 를 바 꾸 려 고 합 니 다.이것 은 매크로 를 정의 하 는 방식 이다.매크로 교체 정의 상수 에 어느 정도 결함 이 있 기 때 문 입 니 다.유형 검 사 를 하지 않 고 역할 영역 제한 이 없습니다(이렇게 하면 후속 오염 되 기 쉽 습 니 다).
#include#includeusingnamespacestd;voidmyfunc1(){#definea 10}voidmyfunc2(){printf("a=%d
", a);}intmain(){printf(" :a=%d
", a);myfunc1();myfunc2();system("pause");return0;}
글자 의 직접 교체 만 하고 전체 국면 이 유효 하기 때문에 정의 가 어디 에 있 든 전체 국면 에 접근 할 수 있 습 니 다.사전 컴 파일 할 때 바 뀌 었 기 때 문 입 니 다.
동시에 오염 되 기 쉽다.
#include#includeusingnamespacestd;#definea 10voidmyfunc1(){#definea 20printf("myfunc1 :a=%d
", a);}voidmyfunc2(){printf("myfunc2 :a=%d
", a);}intmain(){printf(" :a=%d
", a);myfunc1();myfunc2();system("pause");return0;}
매크로 정의 가 있 음 을 알려 줍 니 다.결 과 는 모두 새로운 것 으로 바 뀌 었 습 니 다.매크로 의 방식 은 전체 변수 에 해당 합 니 다.함수 에서 든 함수 밖에서 이름 을 지 을 때 든 정성 을 들 여 조각 해 야 합 니 다.그렇지 않 으 면 앞으로 새로운 함수 에서 실수 로 교체 되 기 쉽 습 니 다.이것 은 바로 왜 상수 가 기본적으로 모두 대문자 로 정의 되 고 변 량 이 모두 소문 자로 되 었 는 지 기억 하지 못 하 는 이상 충돌 하지 않 습 니 다.하지만 그 전체 성 은 해결 되 지 않 았 다.
한편,const 는 역할 영역 제한 이 있어 서 전체 변 수 를 오염 시 키 는 어려움 을 해결 했다.
다음 프로그램 은 안 됩 니 다.
#include#includeusingnamespacestd;voidmyfunc1(){constinta =20;printf("myfunc1 :a=%d
", a);}voidmyfunc2(){printf("myfunc2 :a=%d
", a);}intmain(){printf(" :a=%d
", a);myfunc1();myfunc2();system("pause");return0;}
전역 읽 기 전용 변 수 를 정의 합 니 다:
#include#includeusingnamespacestd;constinta =10;voidmyfunc1(){constinta =20;printf("myfunc1 :a=%d
", a);}voidmyfunc2(){printf("myfunc2 :a=%d
", a);}intmain(){printf(" :a=%d
", a);myfunc1();myfunc2();system("pause");return0;}
안의 것 은 바깥 의 것 을 방해 하지 않 을 뿐만 아니 라 우선 순위 의 구분 도 있 을 수 있 으 며,동시에 전 체 를 해 야 하 는 동시에 전 체 를 할 수도 있다.
이렇게 새로 만 든 함수 에서 a 라 는 이름 을 사용 하려 면 아무 생각 없 이 바로 사용 하면 된다.이전에 밖에서 정 의 된 전역 변수 a 에 영향 을 주지 않 습 니 다.훨씬 편리 하지 않 습 니까?
const 는 변수 만 읽 고 본질 적 으로 변수 이 며 변수 라면 파 라 메 터 를 전달 할 수 있 습 니 다.const 는 유형 검 사 를 하기 때문에 장점 이 더 많 습 니 다.예 를 들 어 형 삼 을 하면 서로 다른 파 라 메 터 를 받 을 수 있 고 유연 합 니 다.
너 는 안에서 나의 변 수 를 바 꿀 수 없 지?서로 다른 변 수 를 전달 할 수 있 기 때문에 더욱 유연 하 다 는 것 을 알 수 있다.
#include#includeusingnamespacestd;voidmyfunc1(constintk){printf("myfunc1 =%d
", k);}intmain(){constinta =20;myfunc1(a);constintb =30;myfunc1(b);system("pause");return0;}
const 의 응용:
변수 만 읽 기 때문에 바깥 의 실 삼 을 보호 하고 밖 에 실 삼 을 전달 하여 함수 체 에서 수정 할 수 없습니다.그래서 바깥 의 실 삼 을 안전성 을 고려 하 게 한다.
#include#includeusingnamespacestd;voidmyfunc1(constint* k){*k =3;printf("myfunc1 =%d
", k);}intmain(){constinta =20;myfunc1(&a);system("pause");return0;}
매크로 교체 방식 은 전체 변 수 를 만 드 는 것 과 같 고 오염 되 기 쉬 우 며 역할 영역 제한 이 없 으 며 우선 순위 구분 을 할 수 없습니다.그것 은 사전 컴 파일 할 때 바 뀌 었 다.
한편,const 는 컴 파일 할 때 변 수 를 분배 하고 역할 영역 구분 이 있 으 며 유형 과 일치 하 는 안전성 검 측 이 있 습 니 다.const 를 응용 하여 프로젝트 를 개발 하 는 것 이 더욱 편리 하고 유연 합 니 다.
매크로 교체 정 의 는 상수 이 며,반드시 전역 적 으로 유효 합 니 다.
const 는 읽 기 변수 만 정의 하고 역할 도 메 인의 구분 이 있 으 며 전체적인 것 도 할 수 있 고 국부 적 인 것 도 할 수 있 으 며 우선 순위 의 구분 도 할 수 있 습 니 다.편리 하고 안전 하 니 대체 할 수 있 습 니 다.근 데 왜 다 있어?모두 좋 은 점 이 있 기 때문에 각자 의 좋 은 점 을 얻 고 싶 을 뿐이다.
매크로 교체 방식 은 전체 컴 파일 과정 을 느리게 합 니 다(사전 컴 파일 시간+실제 컴 파일 시간).그러나 프로그램 운행 속 도 를 빠르게 합 니 다.이미 직접 교체 되 었 기 때문에(매크로 전개)직접 실행 하면 됩 니 다.
const 는 반대로 전체 컴 파일 시간 이 적 지만 프로그램 운행 속도 가 느 립 니 다.메모리 공간 을 찾 아 변 수 를 열 어야 하기 때 문 입 니 다.
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
(Javascript) var, let , const 차이점은Var ( function -scoped) 근데 Javascript는 여기서 좀 웃긴 부분이 있다. 위에서 잠깐 말했지만 IIFE는 function-scope 처럼 보이게 만들어 주지만 결과가 같지는 않다. IIFE...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.