2014-11-25 5 views
5

정수 값을 반환하는 함수가 있습니다. 이제이 함수를 호출하는 매크로를 작성하고 반환 값을 가져 와서 문자열을 앞에 추가하여 결과 문자열을 반환합니다.C에서 매크로는 정수를 반환하는 함수를 호출 한 다음 문자열을 반환합니다.

나는 이것을 시도 :

int ret = 0; 
ret = TEST(2); 
printf("PORT-%d\n", ret); 

이 완벽하게 작동합니다 :

#define TEST(x)  is_enabled(x) 

나는 같은 주요 기능이 매크로를 호출합니다. 그러나 매크로는 문자열 PORT-x를 반환해야합니다. 여기서 x는 호출 된 함수의 반환 값입니다. 어떻게해야합니까?

는 편집 :

나는 또한으로 여러 줄로를 작성했습니다 :

#define TEST(x)\ 
{\ 
    is_enabled(x);\ 
} 

과 같은 주요 기능에 전화 :

printf("PORT-%d\n", TEST(2)); 

그러나 이것은 컴파일을 제공합니다 시간 오류 :

error: expected expression before â{â token 
+0

"sprintf"를 호출하는 매크로를 작성하여 수행 할 수 있지만 버퍼를 할당하고 매크로에 전달해야합니다. 문제는 왜 이것을 처음부터 시작하고 싶습니까? 왜냐하면 당신이 잘못된 방식으로 뭔가를 풀려고하는 것처럼 느껴지기 때문입니다. –

+0

왜'strcat'을 사용할 수 없습니까? 매크로가 필요한 이유는 무엇입니까? – Gopi

+0

당신은 확실히이 함수를 작성해야합니다 ... – Antzi

답변

5

매크로가 아닌 함수를 사용하십시오. 매크로를 사용할 이유가 없습니다.

sprintf(3)을 malloc 또는 버퍼와 함께 사용하여 해결할 수 있습니다. 자세한 내용은 Creating C formatted strings (not printing them) 또는 설명서 페이지를 참조하십시오. 당신의 편집에 관하여

: 당신은 매크로에서 괄호 {}를 사용할 필요가 없습니다, 및 전처리

printf("format%d", { 
    is_enabled(x); 
}); 

더 잘 이해하기 위해 매크로를 실행 GCC 나처럼 뭔가로 번역하는 것처럼 그들은 당신의 오류를 일으키는 -E 플래그가 붙어 있거나이 기사를 읽으십시오. http://en.wikipedia.org/wiki/C_preprocessor

+0

마지막으로 매크로를 작성하는 대신이 함수를 구현했습니다. – iqstatic

2

문자열에 대한 저장소가 있어야하므로 약간의 고통이 있습니다. 모든 정직에서 매크로는 요즘 조건부 컴파일 용으로 만 예약 될 수 있습니다.

상수는 더 나은 열거 유형으로 수행하고 있으며, 매크로 기능은 일반적으로 (inline 컴파일러가 아닌 수요에 제안이라는 지식) 인라인 함수로 더 낫다.

매크로 사용을 주장하는 경우 저장소를 사용하는 경우 스레드에 문제가 있고 정적 문자열로 저장을 수행 할 수 있으며 반환 된 문자열을 지연/다중 사용합니다.

문자열을 동적으로 할당 할 수도 있지만 완료되면 해제하고 메모리 부족 조건을 처리해야합니다.출력

#include <stdio.h> 

#define TEST2_STR(b,p) (sprintf(b,"PORT-%d",p),b) 

int main (void) { 
    char buff[20]; 
    puts (TEST2_STR(buff, 42)); 

    return 0; 
} 

:

PORT-42 

이 경우 매크로가 조금 보인다

는 아마도 쉬운 방법의 라인을 따라, 매크로 사용자가 자신의 스토리지를 제공 요구하는 것입니다 혼동을 일으킬 경우 쉼표 연산자를 사용합니다.이 경우 표현식 (a, b)ab을 모두 평가하며 결과는 b입니다.

이 경우 버퍼를 채우는 sprintf을 평가 한 다음 버퍼를 "반환합니다". 당신이 생각 경우에도, 당신은 전에, 당신은 아마 잘못된 걸 본 적이 : 그 생각을 대부분의 사람들에도 불구하고

for (i = 0, j = 9; i < 10; i++, j--) 
    xyzzy[i] = plugh[j]; 

for의 특징이다, 그건 대단히에서 사용할 수있는 다른 구조를 많은 다른 장소 :

int i, j, k; 
i = 7, j = 4, k = 42; 

while (puts("Hello, world"),sleep(1),1); 

(등등).

관련 문제