ISO C 표준은 동일한 대체 시퀀스를 여러 기호에 할당하는 사전 처리 지시문을 설명하지 않습니다. 나는. 이런 종류의 표준에 존재하지 않습니다
// fantasy syntax:
#definemulti (A B C) replacement token sequence
대체 시퀀스가 여러 토큰을 포함 할 수 있기 때문에, 거기에이 두 이름이 끝나는 곳으로 괄호 나에게 몇 가지 다른 방법이 있고 것 교체 순서.
28 년의 C 코딩에서 필자는 이러한 확장자를 가진 컴파일러를 필요로하는 곳에서는 코드 조각을 보지 못했습니다. 확장명을 가진 컴파일러를 찾았더라도이 코드를 사용하지 않는 것은 거의 불가능합니다. 그만한 가치가있어.
언어에이 기능을 추가하면 약간의 타이핑 만 저장하기 때문에 장애물이 발생할 수 있습니다.
또한 기술은 잘못된 것임을 알릴 수 있습니다.
우리가 여러 컴파일 시간 매개 변수 코드의 동작을 조정하는 —
A
,
B
및
C
—을 말해봐. 그들은 같은 값을 가지므로 한 줄로 정의합니다.
나중에 더 이상 같은 값을 갖지 않으면 프로그램을 편집하여 다른 값을 별도의 #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
...
, 우리는 A
및 C
이 영향을받지 않는 것을보고, 그 B
는 2
로 변경되었습니다.
또한 할당식이 lval0 = lval1 = lval2 = ... = val
인 이유를 고려해야합니다. 하나의 큰 이유는 val
이 한 번만 평가된다는 것입니다. a = b = c
은 평가 순서의 변경 및 c
의 다중 평가로 인해 항상 a = c, b = c
으로 다시 작성 될 수 없습니다.
C 전 처리기에 변수가 없습니다. –
'# define' 매크로가 매크로를 정의합니다. 변수가 아닙니다. 상수의 경우에는 'static const int VAR1 = 1;'또는 이와 비슷한 것을 사용하는 것이 더 좋습니다. 타입 안전성을 높이고, 컴파일러를 최적화하면 똑같이 좋은 코드를 생성 할 수 있어야합니다. – hyde
두 번째 해결책은 합리적입니다. 그게 무슨 문제 야? –