2013-05-16 3 views
1

나는 내가 만든 알고리즘을 구현하는 암호화 응용 프로그램을 만들고 있습니다. 저는 C에서 약 1 년간의 경험과 C++에서 6 개월의 경험을 가지고 있습니다. 그러나 Visual Basic과 Gambas에서 6 년의 경력을 쌓았습니다. (그리고 저는 빨리 배우기를 바랍니다.) 가능한 한 효율적으로 새 응용 프로그램을 만들고 싶습니다. 그게 내가 C++ 대신 C를 집어 들게 한 이유입니다. (나는 저수준 언어를 사용하고 싶었습니다.)자유롭게 정의 된 문자열 상수

내 프로그램에서 정의 된 문자열 상수를 사용하여 오류 메시지를 처리하고 있습니다. 전 처리기가 매번 매크로 이름을 실제 문자열로 대체한다는 것을 알고 있습니다. 실수가 아니라면 문자열 상수를 미리 할당하고 모든 발생에 대해 다른 포인터를 반환한다는 의미입니다. 모든 문자열 포인터를 해제해야합니까? 실제로 그것은 약간 이상하게 보입니다 ... 포인터는 자동 변수와 같습니다 (범위에서 벗어날 때 해제된다는 의미입니다) 또는 영원히 상수로 머물러 있습니까?

나는 messages.h와 같은 전용 헤더 파일을 사용하는데,이 헤더 파일에는 프로그램이 사용할 수있는 모든 가능한 오류 메시지의 정의가 들어있어 언어 등을보다 쉽게 ​​변경할 수 있습니다. 따라서 문자열 상수로 직접 쓸 수는 없습니다. 나는 그것들을 상수 변수로 선언 할 생각을 했었지만 실제 값을 가진 C 파일을 사용해야하고 헤더 버전을 extern으로 선언하거나 모든 상수를 messages.h 헤더를 포함하는 모든 파일 안에 다시 선언해야한다. 저를 믿으십시오, 나는 그 프로젝트를 구성하는 20 개 이상의 파일을 가지고 있으며, 약 50-100 개의 메시지와 함께 프롬프트 메시지 인 — 약 30 개의 긴 메시지가 —이므로 상당한 메모리를 소비 할 것입니다.

무엇을 제안합니까? — 및 더 중요한 것은 내가 — 상수 포인터를 무료로 할 수 있습니까?

+0

사전 처리 된 소스에서 문자열 리터럴로 표시되는 경우 동적으로 할당되지 않았기 때문에이를 해제 할 필요가 없습니다 (실제로는 해제하지 않는 모든 이유). –

+0

그리고 동일한 긴 문자열 매크로의 많은 인스턴스가 누적되면서 메모리를 사용하지 않습니까? – someone

+1

매크로가 사용 된 경우에만 매크로 세그먼트가 데이터 세그먼트가 아닌 텍스트 세그먼트에 있습니다. 메시지를 '정의'하는 데 사용하는 양식에 따라 다릅니다. 헤더가'static const char message1 [] = "blah";를 헤더에 쓰면 공간을 낭비하게됩니다. '#define message1 "blah"'라고 말하면, 그 공간이 사용될 때만 공간이 생깁니다. 헤더에'extern const char message1 [];'이라고 쓰면 변수에 정의 된 (선언하는 것과 반대되는) 파일에 각 문자열의 복사본 하나만 있습니다. –

답변

1

C에 오신 것을 환영합니다. VB로 돌아 가지 말아주세요.) ... ... 매크로, 아니요. "문자열"을 해제 할 필요가 없으며 모든 발생에 대해 다른 포인터를 반환하지 않습니다. 살펴 :

#include <stdio.h> 

#define ERROR_MSG "Bla bla bla" 

int main(void) 
{ 
    printf("%p\n", (void *)ERROR_MSG); 
    printf("%p\n", (void *)ERROR_MSG); 
    return 0; 
} 

출력 :

0x40061c 
0x40061c 

를 같은 주소가 인쇄되어 볼 수 있듯이.

+2

매번 다른 포인터를 반환 할 수 있습니다. C 표준 (ISO/IEC 9899 : 2011)은 6.4.5 절에서 설명합니다. ** 문자열 리터럴 ** : _ 이들 요소가 적절한 값을 갖는 경우 이러한 배열이 구분되는지 여부는 지정되지 않습니다. 프로그램이 그러한 배열을 수정하려고하면, 동작은 undefined입니다. _ 물론 배열은 문자열 리터럴과 관련된 배열입니다. –

+0

오, 그래! 그게 내가 필요로하는 확실한 대답 ...전 프로세서 명령어가 코드 내부의 것들을 바꾼다는 것을 알았습니다. 그래서 컴파일러가 동일한 메시지의 두 인스턴스를 발견했을 때, 그것이 똑같은 것을 이해할 수 없을 것이라고 생각했습니다. (gcc가 더 영리 해 보입니다. 이것보다)! 매우 감사합니다!!! : D – someone

+0

그러면 우리는 어둠 속에서 방황하고 있습니까? – someone