C 매크로에서 출력 사용 및 반환
오류 메시지를 잡고 인쇄하기 위해 코드를 설치하려고 합니다.현재 매크로를 사용하고 있습니다.
#define my_function(x) \
switch(function(x)) { \
case ERROR: \
fprintf(stderr, "Error!\n"); \
break; \
}
보통 저는 기능 출력을 캡처하지 않고 잘 작동합니다.하지만 몇 가지 사례를 발견했는데, 이 사례의 반환 가치는 다음과 같습니다.function(). 다음과 같은 것을 시도했지만 구문 오류가 발생합니다.
#define my_function(x) \
do { \
int __err = function(x); \
switch(__err) { \
case ERROR: \
fprintf(stderr, "Error!\n"); \
break; \
} \
__err; \
} while(0)
함수의 반환 값을 유지하기 위해 전역 변수를 선언할 수는 있지만, 이는 보기 흉하고 프로그램이 다중 스레드이므로 문제가 발생할 가능성이 높습니다.더 좋은 해결책이 있기를 바랍니다.
GCC에는 문 표현이라는 기능이 있습니다.
매크로를 정의하면 다음과 같습니다.
#define FOO(A) ({int retval; retval = do_something(A); retval;})
그러면 당신은 그것을 사용할 수 있을 것입니다.
foo = FOO(bar);
이것은 비교적 복잡한 코드이므로 매크로에 둘 이유가 별로 없습니다.성공하다inline(C99) 또는static(C89) 또는 둘 다 헤더 파일에 넣고 싶은 경우.합리적인 컴파일러를 사용하면 매크로와 동일한 효율성을 얻을 수 있습니다.
답장이 많이 늦었습니다.하지만 그럼에도 불구하고요.인라인 기능이 더 낫다는 것에는 동의하지만 매크로는 인라인 기능에서는 얻을 수 없는 인쇄의 재미를 제공합니다.저는 @qrdl님이 문장을 조금만 재구성했다면 정말로 문장 표현을 사용할 수 있다는 것에 동의합니다.매크로와 함께 작동하는 방법은 다음과 같습니다.
#define my_function(x, y) ({ \
int __err = 0; \
do { \
__err = function(x, y); \
switch(__err) { \
case ERROR: \
fprintf(stderr, "Error!\n"); \
break; \
} \
} while(0); \
__err; \
})
죄송합니다. 편집입니다.
- 제 생각에는 그냥 곱슬곱슬한 교정기만 있으면 될 것 같아요.할 필요가 없습니다.키워드를 지정하는 동안
- 백슬래시가 각 행의 마지막 문자인지 확인합니다(뒤에 공백 없음).
- 매크로에서 err 값을 가져올 필요가 있다면 매개 변수를 추가하면 됩니다.
이와 같습니다.
#define my_function(x, out) \
{ \
int __err = function(x); \
switch(__err) { \
case ERROR: \
fprintf(stderr, "Error!\n"); \
break; \
} \
__err; \
(*(out)) = _err; \
}
통과 참조 C 패러다임을 유지하려면 다음과 같이 my_function을 호출해야 합니다.
int output_err;
my_function(num, &output_err);
이렇게 하면 나중에 my_function을 실제 함수로 만들기로 결정하면 호출 참조를 변경할 필요가 없습니다.
그건 그렇고, qrdl의 "Statement Expressions"도 좋은 방법입니다.
함수가 무언가를 반환하는 경우 변수를 선언할 필요가 없으므로 해당 값을 직접 얻을 수 있습니다.예를 들어,
#define FOO(A) do_something(A)
여기 do_something이 일부 정수를 반환합니다.그러면 다음과 같이 쉽게 사용할 수 있습니다.
int a = FOO(a);
언급URL : https://stackoverflow.com/questions/3532621/using-and-returning-output-in-c-macro
'programing' 카테고리의 다른 글
| Python docstring의 클래스 메서드에 대한 링크 (0) | 2023.09.27 |
|---|---|
| build.gradle 파일에 주석을 작성하는 구문은 무엇입니까? (0) | 2023.09.27 |
| 사용자 지정 게시 유형 관리 페이지에 사용자 지정 분류법 열 표시 (0) | 2023.09.17 |
| 사용자 지정 보기에 대해 attrs.xml의 동일한 이름의 특성 (0) | 2023.09.17 |
| XMLHttpRequest를 다른 도메인으로 만들 수 있습니까? (0) | 2023.09.17 |