2017-05-11 8 views
1

일부 클래스 (예 : ClassX, ClassY 등)에 루틴을 제공하는 라이브러리 (MyLib.hMyLib.cpp)가 있습니다. 는 MyLib.h에서 나는 #define 처리기 지시문을 사용하여 두 개의 상수를 정의 : 나는 각각의 문자열을 사용하고자하는 경우C++ #define에 액세스 수정 자 설정 CONSTANT_NAME constant_value

#define LOCAL_STR "this string can not be shared among classes that don't #include "MyLib.h"" 

#define TOSHARE_STR "this string can be shared among classes that #include "MyLib.h"" 

두 문자열 값을 제안한다. 제 생각에는 첫 번째 코드는 MyLib.cpp 코드에만 사용하고 두 번째 코드는 ClassX, ClassY 코드 등을 사용해야합니다.

C++는이 두 상수에 대해 원하는 가시성을 정의하는 방법을 제공합니까? 현재 그들은 모든 곳에서 볼 수 있습니다 ...

+1

클래스가 일을 #include를하지 않는 IFDEF 블록을 그들을 정의 할 수 있습니다 일부 공유 사람이 필요하면

, 번역 단위는 않습니다. #defines는 상수가 아니며 텍스트 대체 규칙입니다. – Caleth

답변

1

당신의 LOCAL_STR 타입 #define은 MyLib.cpp에 사용되는 것을 확인하는 간단한 방법은 오히려 전처리 어쨌든, 작동하지 어떻게 MyLib.h

2

당신은 #define d 개의 상수로함으로써 전처리 기능을 이런 방식으로 사용하고 있습니다. 이 메커니즘을 사용하면 정의가 포함 된 모듈에이 메커니즘이 표시됩니다. 당신이 정말로 원하는 무엇

는 관련 클래스의 상수 문자열 (std::string 또는 const char*)를 선언하고 액세스하는 방법을 제어하는 ​​가시성 제어 public, protectedprivate를 사용합니다.

2

짧은 대답 : 아니오.

문자열 리터럴은 형식적으로 정적 저장 기간의 일정한 배열입니다. 컴파일러가 자신의 정의를 볼 수있는 한 어디에서 사용하는지 제어 할 수있는 방법이 없습니다. 그리고 그들의 주소 (또는 요소의 주소)는 인수로 모든 함수에 전달 될 수 있습니다.

프리 프로세서 매크로는 범위와는 독립적이지만 각 컴파일 단위에 #define 지점부터 컴파일 단위 끝까지 또는 해당 #undef (둘 중 빠른 날짜 적용)까지 존재합니다.

즉, 헤더가 #include 인 모든 컴파일 단위에는 매크로와 문자열 리터럴이 모두 표시됩니다.

대체 메커니즘이 있기 때문에 C++ (포함 가드 제외)에서 매크로를 사용하는 것이 좋지 않은 스타일이라고 간주되는 경우가 많습니다. 문자열에 대한 액세스를 제어하려면 적절한 액세스 제어를 사용하여 클래스의 명명 된 멤버로 만듭니다. 헤더 파일에 선언 된 매크로 및 문자열 리터럴을 사용하는 대신.

0

보다, 거기에 넣어, 당신은 컴파일 할 수

hello.h

#ifdef PREPROCESSING 
    #define STR "this is only seen in hello.c" 
#endif 

에서는 hello.c

: 각 소스는 separetely 당신은 같은 것을 가질 수 대신 한 번에 모든 파일을 컴파일의 매크로 컴파일러를 공급하므로

이 플래그는 -c 플래그가있는 객체로 컴파일 될 수 있으며 "PREPROCESSING"을 매크로 (-D 옵션 사용)로 전달하면 hello의 ifdef가 전달됩니다.시간이되면 당신의 문자열

gcc -c -DPREPOROCESSING hello.c -o hello.o 

를 정의, 전달합니다, 당신은 그 (것)들을 공유하지 않고 그 각각이 자신의 매크로를 정의합니다, 함께 여러 .o 인 파일을 링크 할 수 있습니다. 당신이 중 하나를 또 다른 .H 파일을 사용하거나