2014-05-19 1 views
0

다음 코드평가 조건문이

ifeq (1,1) 
    a = 1 
    $(info true) 
endif 
ifeq (1,0) 
    a = 0 
    $(info false) 
endif 

$(info $(a)) 

인쇄

true 
1 

하게 그리고 나는 그것을 얻을. 나는 define 내에서 같은 일을 넣고 평가한다면 ( $(a)의 값이 드디어 1로)

define foo 
ifeq (1,1) 
    a = 1 
    $(info true) 
endif 
ifeq (1,0) 
    a = 0 
    $(info false) 
endif 
endef 

$(eval $(call foo)) 
$(info $(a)) 

IT는 ifeq (1,0)이 true로 평가하지 않습니다

true 
false 
1 

를 인쇄합니다. 그런데 왜 false이 인쇄 되었습니까?

답변

1

make가 평가 결과를 구문 분석하기 전에 먼저 평가할 문자열을 확장합니다.

eval의 인수가 확장 될 때 info 기능이 확장되고는 전에 메이크 코드를 파싱한다.

define foo 
ifeq (1,1) 
    a = 1 
    $$(info true) 
endif 
ifeq (1,0) 
    a = 0 
    $$(info false) 
endif 
endef 
+0

아 : 당신은 eval$ 탈출하여 검사하고 info 때까지 연기 할 필요가있다. 역 참조 구문으로 인해 내장 함수가 실행되었습니다. 말이된다. 감사. – Jeenu

+1

확장 기능을 사용하면 모든 변수와 함수가 확장되거나 확장되지 않습니다. 그리고 확장은 재귀 적입니다. 그것을 피할 수있는 유일한 방법은'$'를 벗어나거나'$ (value ...)'함수를 사용하는 것입니다. – MadScientist

관련 문제