programing

C 매크로에서 출력 사용 및 반환

jooyons 2023. 9. 27. 17:54
반응형

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; \
})

죄송합니다. 편집입니다.

  1. 제 생각에는 그냥 곱슬곱슬한 교정기만 있으면 될 것 같아요.할 필요가 없습니다.키워드를 지정하는 동안
  2. 백슬래시가 각 행의 마지막 문자인지 확인합니다(뒤에 공백 없음).
  3. 매크로에서 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

반응형