IT TIP

C에서 문자열 상수를 어떻게 선언합니까?

itqueen 2020. 12. 3. 21:31
반응형

C에서 문자열 상수를 어떻게 선언합니까?


C에서 숫자 상수를 enums 대신 s 로 선언하는 것이 관용적이거나 적어도 좋은 스타일이라는 것을 알고 #define있습니다.

/* bad style */
#define MAXLINE 1024

/* good/better style */
enum {
    MAX_LINE = 1024
};

문자열 상수의 정의에 대한 동등한 규칙이 있습니까?

/* is this good style? */
#define HELLO "Hello World"

/* or is this better? */
const char *HELLO2 = "Howdy";

당신은 무엇을 선호합니까? 가능하다면 두 방법의 몇 가지 단점을 보여주십시오.


로마로가는 길이 (적어도) 하나 더 있습니다.

static const char HELLO3[] = "Howdy";

( static— 선택 사항 — 다른 파일과 충돌하지 않도록합니다). 나는 const char*이것을 사용할 수 있기 때문에 이것을 선호 sizeof(HELLO3)하고 따라서 컴파일 타임에 할 수있는 것을 런타임까지 연기 할 필요가 없습니다.

정의는 컴파일 시간 연결의 장점이 있지만 (생각 HELLO ", World!") 할 수 sizeof(HELLO)있습니다.

그러나 그런 다음 const char*여러 파일에서 선호 하고 사용할 수도 있으므로 메모리를 절약 할 수 있습니다.

요컨대-상황에 따라 다릅니다.


문자열 상수를 정의 할 때 (매우 사소하지만) 장점 중 하나는 연결할 수 있다는 것입니다.

#define HELLO "hello"
#define WORLD "세계"

puts (HELLO WORLD);

이것이 실제로 이점인지는 확실하지 않지만 const char *와 함께 사용할 수없는 기술입니다.


질문과 같은 "const string"을 원하면 질문에 언급 한 버전을 사용합니다.

/* first version */
const char *HELLO2 = "Howdy";

특히 다음을 피할 것입니다.

/* second version */
const char HELLO2[] = "Howdy";

이유 : 두 번째 버전의 문제는 컴파일러가 전체 문자열 "Howdy"의 복사본을 만들고 그 문자열을 수정할 수 있다는 것입니다 (정말 const가 아님).

반면에 첫 번째 버전은 const 포인터 HELLO2가 액세스 할 수있는 const 문자열이며, 누구도 수정할 수있는 방법이 없습니다.


#define 메서드의 가장 큰 단점은 문자열이 사용될 때마다 복제되므로 실행 파일에 많은 복사본이 생겨서 더 커질 수 있다는 것입니다.

참고 URL : https://stackoverflow.com/questions/1431576/how-do-you-declare-string-constants-in-c

반응형