2012-12-05 3 views
5

make 파일에서 다음 코드를 사용하여 CPP 파일에서 VENDOR_NAME 변수에 액세스합니다.CPP 파일에서 make 파일 문자열 변수 사용

에는 문자열이 들어 있습니다.

이 변수를 사용하려고하면 내 cpp 파일에서 아래와 같이 오류가 발생합니다.

cout << VENDOR_NAME;

Feature1.cpp.bak.cpp:8:Feature1.cpp.bak.cpp:8:가 (각 선언되지 않은 식별자가 내 문자열을 큰 따옴표가 포함되어 있지 않습니다 및 컴파일러이기 때문에이 추측

한 번만보고 'Default_Vendor'선언되지 않은 (먼저이 기능을 사용) 변수로 VENDOR_NAME의 콘텐츠를 고려해보십시오.

이 변수를 내 CPP 파일에서 문자열로 가져 와서 #define에 해당하는 것처럼 사용할 수 있습니까?

감사 ...

답변

10

귀하의 메이크 파일은 컴파일러에 대한 명령 줄을 생성 할 것입니다. 발생하는 문제는 그냥 따옴표로 값을 둘러싸는 경우 :

EXTRA_DEFINE += -DVENDOR_NAME="$(VENDOR_NAME)" 

... 아마 그들을 제거거야 그래서 간단하게, 명령 줄 인수를 서술로 따옴표를 볼 수 쉘 (그것은 비록 당신이 사용하고있는 쉘에 의존 할 수있다). 그것을 방지하기 위해, 당신은 탈출 따옴표와 함께 인수를 만들 수 있습니다 :

EXTRA_DEFINE += -DVENDOR_NAME="\"$(VENDOR_NAME)\"" 

나는 적어도 윈도우와 리눅스의 일반적인 쉘, 대부분의 생각의 보존을 탈출로 백 슬래시를 받아 들일 것입니다 따옴표가 있지만 적어도 인용 부호를 다르게 사용해야하는 주변에는 적어도 하나가 있다고 확신합니다.

+0

... 까다로운 – Potatoswatter

+0

:

#define stringify(x) stringify_literal(x) #define stringify_literal(x) # x std::cout << stringify(VENDOR_NAME); 

VENDOR_NAME 쉼표를 포함 할 수있다, (더 이상 사용할 수 실제로 공식적으로 C++ 11) 전 처리기 가변 인자 매크로에 대한 지원을 감안할 때 @ Potatoswatter : 더 이상은 안돼! :-) –

+0

@ 제리 코핀 : 고마워요. 이것은 하루를 절약하기에 충분합니다. 매크로에 안녕히 계십시오. – NeonGlow

3

전 처리기를 사용하여 문자열로 변환하십시오. 매크로 확장의 수준을 실종

#define stringify(...) stringify_literal(__VA_ARGS__) 
#define stringify_literal(...) # __VA_ARGS__ 

std::cout << stringify(VENDOR_NAME); 
+1

'VENDOR_NAME'에 쉼표가 포함되어 있으면 문제가 발생할 수 있습니다 (예 : 'Foo, Inc.'). 아마도 메이크 파일 자체의 인용을 처리하는 것이 가장 좋습니다. – jamesdlin

+0

@Potatoswatter : 답변 해 주셔서 대단히 감사합니다. make 파일 자체에서이 작업을 수행 할 수 있다면 더 유용 할 것입니다. 도움을 주시면 알려 주시기 바랍니다. – NeonGlow

+0

@jamesdin : 지적 해 주셔서 감사합니다. 이 작업을 수행하는 방법에 대해 도움을받을 수 있습니까? – NeonGlow