2016-11-06 5 views
2

두 개의 C 선행 처리기 매크로에 동일한 값을 동시에 할당 할 수 있습니까?동일한 명령에 2 개의 C 선행 처리기 변수를 할당하십시오.

a = b = 1; 

당신이 할 수있는 알고 : 그것은이 보통의 C 코드와 유사한 행동을 할

#define VAR1 1 
#define VAR2 1 

을하지만 지금은 엉망 것들 코드 복제 및 더 많은 기회가 그냥 있기 때문에 약간의 고통 쪽으로. 이 유일한 해결책인가?

#define VAR1 1 
#define VAR2 VAR1 

편집 : 다양한 댓글는 전처리 매크로하지 변수가 지적했다. 미안합니다.

+10

C 전 처리기에 변수가 없습니다. –

+1

'# define' 매크로가 매크로를 정의합니다. 변수가 아닙니다. 상수의 경우에는 'static const int VAR1 = 1;'또는 이와 비슷한 것을 사용하는 것이 더 좋습니다. 타입 안전성을 높이고, 컴파일러를 최적화하면 똑같이 좋은 코드를 생성 할 수 있어야합니다. – hyde

+1

두 번째 해결책은 합리적입니다. 그게 무슨 문제 야? –

답변

2

ISO C 표준은 동일한 대체 시퀀스를 여러 기호에 할당하는 사전 처리 지시문을 설명하지 않습니다. 나는. 이런 종류의 표준에 존재하지 않습니다

// fantasy syntax: 
#definemulti (A B C) replacement token sequence 

대체 시퀀스가 ​​여러 토큰을 포함 할 수 있기 때문에, 거기에이 두 이름이 끝나는 곳으로 괄호 나에게 몇 가지 다른 방법이 있고 것 교체 순서.

28 년의 C 코딩에서 필자는 이러한 확장자를 가진 컴파일러를 필요로하는 곳에서는 코드 조각을 보지 못했습니다. 확장명을 가진 컴파일러를 찾았더라도이 코드를 사용하지 않는 것은 거의 불가능합니다. 그만한 가치가있어.

언어에이 기능을 추가하면 약간의 타이핑 만 저장하기 때문에 장애물이 발생할 수 있습니다.

또한 기술은 잘못된 것임을 알릴 수 있습니다.

우리가 여러 컴파일 시간 매개 변수 코드의 동작을 조정하는 — A, BC —을 말해봐. 그들은 같은 값을 가지므로 한 줄로 정의합니다.

나중에 더 이상 같은 값을 갖지 않으면 프로그램을 편집하여 다른 값을 별도의 #define 구조로 분리해야합니다. 이것으로부터, 예를 들면 :

#definemulti (A B C) 1 

#definemulti (A C) 1 
#define B 2 

이것이 A C과 접촉 광고 DIFF 리드. B이 (가) 밖으로 마이그레이션 되었기 때문에 전체 definemulti 줄이 새로운 것으로 바뀝니다.

@@ -x, y +z, w @@ 
... 
-#define (A B C) 1 
+#define (A C) 1 
+#define B 2 
... 

반면 처음에, 우리가 가지고있는 경우 :

#define A 1 
#define B 1 
#define C 1 

은 diff 화물선이 같은 좋네요 :

하는 GNU 스타일의 문맥 diff에서의 변화는 다음과 유사 할 수 있습니다 눈에서
@@ -x, y +z, w @@ 
... 
#define A 1 
-#define B 1 
+#define B 2 
#define C 1 
... 

, 우리는 AC이 영향을받지 않는 것을보고, 그 B2로 변경되었습니다.

또한 할당식이 lval0 = lval1 = lval2 = ... = val 인 이유를 고려해야합니다. 하나의 큰 이유는 val이 한 번만 평가된다는 것입니다. a = b = c은 평가 순서의 변경 및 c의 다중 평가로 인해 항상 a = c, b = c으로 다시 작성 될 수 없습니다.

0

preprocessor syntax을 보면 두 매크로를 함께 설정하는 표준 방법이없는 것처럼 보입니다. 구문을 사용하면 하나의 토큰 만 하나 이상의 대체 토큰으로 변경할 수 있으며 연산자 체인과 같은 것은 허용되지 않습니다.

전 처리기 지시문이 줄 바꿈으로 끝나야하기 때문에 동일한 줄에 두 개의 지시문을 넣을 수도 없습니다. 선행 처리기가 실행되기 전에 줄 바꿈 문자를 삽입하는 데 사용되는 digraphs or trigraphs도 없습니다 (이전 SO 응답의 수로 확인 됨).

0

제가 추정 할 수있는 경우, 두 개의 빌드 구성 매크로가 필요하지만 보통은 같은 값을 가져야합니다. 당신이 VAR2 구성으로 정의하기로 결정한 경우

하나 개의 솔루션은, 지금, 당신의 마지막 코드에

#define VAR1 1   /* May be from a configuration file or makefile. */ 

/* In the proper source: */ 
#ifndef VAR2   /* If some configuration is still missing, */ 
# define VAR2 VAR1 /* fill in the blank. */ 
#endif 

을 조금 자세히 설명하는 것, 그것은 ifndef 내부의 기본 설정을 취소합니다.