함수와 같은 매크로에 전처리기 지시어를 추가하는 것이 잘못된 것입니까?
제 질문이 이 질문이나 이 질문과 비슷하다는 것을 알고 있지만 실제로는 동일하지 않으며 두 번째 질문에는 응답이 허용되지 않았습니다. 함수와 같은 매크로를 호출할 때 전처리기 지시어를 추가하는 것이 올바른지 묻기로 결정했습니다.
제 경우에는 기능과 유사한 매크로가 있습니다.
#define FUNC_MACRO(a, b) // do something with the variables
코드 어딘가에서 다른 매크로가 정의되어 있다면 특정한 차이를 가지고 부를 수 있습니다.
// ...
FUNC_MACRO(aVal
#ifdef ANOTHER_MACRO
+ offset
#endif // ANOTHER_MACRO
, bVal);
// ...
제 기계(linux, gcc 4.8 포함)에서 테스트를 했는데 정상적으로 작동했습니다(사전 프로세서 지시어 사용 및 없음, ANOTHER_MACRO가 정의된 경우 및 없음). 하지만 그렇게 해도 안전합니까?
처음 비슷한 질문의 답에서 16.3/9단락을 읽었는데, 제 경우에도 사실인가요?
C 언어는 6.10.3 매크로 교체, 11:에서 이를 정의되지 않은 동작으로 남깁니다.
인수 목록 내에 사전 처리 지시자 역할을 할 수 있는 사전 처리 토큰 시퀀스가 있으면 동작이 정의되지 않습니다.
그래서 실제로 그것을 하는 것은 잘못된 것입니다.
GCC와 다른 인기 있는 컴파일러들은 그것을 이해하지 못합니다. 이것이 아마도 이 언어를 사용하는 많은 사용자들이 인식하지 못하는 이유일 것입니다.제 코드 중 일부가 PCC에서 컴파일에 실패했을 때 이 문제가 발생했습니다(그리고 제 코드의 버그를 즉시 수정했습니다).
업데이트: PJTrail은 매크로 확장 내부에 전처리기 지시사항이 있는 것이 "오해의 소지가 있거나 의미가 없는" 경우를 댓글로 요청했습니다.여기 분명한 것이 있습니다.
foo(a, b,
#ifdef BAR
c);
#else
d);
#endif
언어가 매크로 확장 내부의 균형 잡힌 전처리기 조건이 괜찮다는 것을 명시하는 것이 타당했을지는 확실하지 않지만, 처리되어야 하는 순서대로 모호함이 있는 문제에 부딪히게 될 것이라고 생각합니다.
대신에 다음을 수행합니까?
#ifdef ANOTHER_MACRO
FUNC_MACRO(aVal + offset, bVal);
#else
FUNC_MACRO(aVal, bVal);
#endif
편집: 코멘트에 의해 제기된 우려를 해결합니다. OP의 방법이 구체적으로 잘못된 것인지는 모르겠습니다(다른 답변이 그것을 커버한다고 생각합니다).그러나 간결성과 명확성은 C로 코딩할 때 상당히 중요한 두 가지 측면입니다.
그렇기 때문에 위에서 제시한 것과 같은 상황을 약간 재고함으로써 OP가 시도하고 있는 것처럼 보이는 것을 달성하기 위한 더 나은 방법을 찾고 싶습니다.OP가 사소한 예를 사용했을 수도 있다고 생각하지만 대부분의 C 상황에서 무언가가 지나치게 복잡해지거나 언어가 허용하지 않는 것처럼 보이는 일을 시도하는 경우 필요한 것을 달성할 수 있는 더 나은 방법이 있다는 것을 알게 됩니다.
언급URL : https://stackoverflow.com/questions/39534609/is-it-wrong-to-add-preprocessor-directives-in-a-function-like-macro
'programing' 카테고리의 다른 글
| 짧은 프로시저를 실행하려고 할 때 쿼리 시간 초과가 만료됨 (0) | 2023.10.14 |
|---|---|
| ASP.NET MVC 6 AspNet.세션 오류 - 유형에 대한 서비스를 확인할 수 없습니까? (0) | 2023.10.14 |
| Excel VBA에서 텍스트 파일에 어떻게 안정적으로 쓸 수 있습니까? (0) | 2023.10.14 |
| Jenkins powershell 플러그인이 항상 성공적으로 빌드됨 (0) | 2023.10.14 |
| Github 개인 저장소에 대한 Jenkins CI 인증 (0) | 2023.10.14 |