programing

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

bestcode 2022. 8. 11. 23:03
반응형

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

C에서 숫자 상수를 다음과 같이 선언하는 것이 꽤 관용적이거나 적어도 좋은 스타일이라는 것을 알고 있습니다.enum대신 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 "world"

puts( HELLO WORLD );

그게 정말 좋은 점인지는 잘 모르겠지만, 그건 다른 사람들과 함께 사용할 수 없는 기술입니다.const char *

당신의 질문처럼 "계속 문자열"을 원하신다면, 저는 당신이 질문에서 말한 버전을 정말로 원합니다.

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

특히, 나는 다음을 피하고 싶다.

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

이유: 두 번째 버전의 문제는 컴파일러가 "Howdy" 문자열 전체를 복사하고 그 문자열은 수정할 수 있다는 것입니다(따라서 실제로는 변하지 않습니다).

한편, 첫 번째 버전은 포인터 HELLO2에서 액세스할 수 있는 const 문자열이므로 변경할 수 없습니다.

그것들은 몇 가지 차이점입니다.

#define HELLO "Hello World"

위의 문장은 프리프로세서와 함께 사용할 수 있으며 프리프로세서에서만 변경할 수 있습니다.

const char *HELLO2 = "Howdy";

위의 문장은 c코드로 변경할 수 있습니다.이제 아래 문장과 같이 각각의 문자를 변경할 수 없습니다.이는 일정하기 때문입니다.

HELLO2[0] = 'a'

단, 아래 문장과 같이 다른 문자열을 가리킬 수 있습니다.

HELLO2 = "HELLO WOLRD"

변수를 어떻게 바꾸느냐에 따라 달라집니다.프리프로세서 또는 C코드를 사용합니다.

#define 메서드의 주요 단점은 문자열이 사용될 때마다 중복되므로 실행 파일에 많은 복사본이 저장되므로 더 커질 수 있습니다.

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

반응형