C ++ 매크로에 Newline을 포함시키는 방법 또는 C ++ 템플릿을 사용하여 동일한 작업을 수행하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1548017

문제

다음 질문을 보았습니다.CPP 매크로에서 Newline을 생성하는 방법은 무엇입니까?

C ++ 사전 처리기의 Newline에서 필요에 대한 간단한 요구 사항을 알려 드리겠습니다. C ++ 코드와 함께 임베디드 어셈블리 코드를 사용하는 코드에서 ARM RealView Compiler 3.1에서 작업 중입니다.

#define DEFINE_FUNCTION(rtype, op, val) \
    __asm rtype nt_##op(void*) { \   
      str lr, [sp, ##val];bl vThunk_##op;ldr lr, [sp,##val];bx lr; \
    } \
   void vThunk_##op(void*)

DEFINE_FUNCTION(void*, mov_lt, #0x04)
{
     // do some operation
}

위의 매크로는 기능 본문의 각 문을 강제로 요구하는 임베디드 어셈블리 함수를 선언합니다.

나는 이것이 기능 본문의 텍스트가 ARM 컴파일러에 의해 ARM 어셈블러로 맹목적으로 전송되기 때문이라고 생각합니다.

왜 C ++ 전처리 기가 여전히 멀티 라인 교체를 지원하지 않습니까? 또한 교체 문자열에서 #를 사용할 수 없습니다. 예를 들어, 이런 종류의 어셈블리의 경우

str lr, [sp, #0x04]

나는 많은 방법과 방법을 시도했지만 실제로는 아무것도 해결되지 않았습니다. ARM 어셈블러/컴파일러는 기본적이므로 GCC에 ASM 휘발성과 같은 API가 없습니다.

define_function 매크로는 많은 장소에서 사용되므로 무시할 수 없습니다.

따라서 Final Resort에서 다음 솔루션에 대해 생각합니다.

  • C ++ 사전 처리기 대신 M4 전 처리기 사용
  • C ++ 템플릿을 사용하여 어떻게 든이를 달성하고 Grep/Sed를 사용하여 Define_Function을 대체하십시오.

누구든지 위의 일을 할 수있는 방법이나 방법을 줄 수 있습니까? ARM RealView Compiler 3.1 이외의 컴파일러를 사용할 수 없습니다.

새로운 라인과 같은 확장이 필요합니다. DEFINE_FUNCTION(void*, mov_lt, #0x04) {},

__asm void* nt_mov_lt(void*) {   
      str lr, [sp, 0x04];
      bl vThunk_mov_lt;
      ldr lr, [sp,0x04];
      bx lr;
    }
 void vThunk_mov_lt(void*)
 {
     // do something
  }
도움이 되었습니까?

해결책

GNU M4 사전 처리기를 사용하여 위의 문제를 해결했습니다.

m4_define('DEFINE_FUNCTION','
     __asm rtype nt_$2(void*) {  
      str lr, [sp, $3];
      bl vThunk_$1;
      ldr lr, [sp,$3];
      bx lr;
    } 
   void vThunk_$2(void*)')

DEFINE_FUNCTION(void*, mov_lt, 0x04)
{
}

M4를 사용하여 위 코드를 전처리하면 코드에서 Newline 요구 사항 문제를 해결했습니다. C Preprocessor 및 컴파일 스테이지가 그림에 들어 오기 전에 소스 파일이 처리되도록 M4 -P를 사전 빌드 이벤트로 RAN.

도움을 주셔서 감사합니다. 그러나 최신 C ++ 컴파일러에는 우수한 매크로 사전 프로세서의 범위가 실제로 있습니다.

다른 팁

모든 가스 버전에는 다른 Newline 대체 문자가 있습니다. 예를 들어 AVR은 ARM 가스 버전에 대한 캐릭터에 대한 $를 찾습니다.

당신의 예는 매우 혼란 스럽지만 이것이 효과가 없습니까?

#define DEFINE_FUNCTION(rtype, op, val) \
    __asm rtype nt_##op(void*) { \   
      str lr, [sp, val];\
      bl vThunk_##op;\
      ldr lr, [sp,val];\
      bx lr;\
    }\
   void vThunk_##op(void*)

그리고 호출 할 때

DEFINE_FUNCTION(void*, mov_lt, 0x04)  // notice no # here
{
     // do some operation
}

당신은 얻을 것입니다

__asm void* nt_mov_lt(void*) {   
      str lr, [sp, 0x04];
      bl vThunk_mov_lt;
      ldr lr, [sp,0x04];
      bx lr;
    }
 void vThunk_mov_lt(void*)
 {
     // do something
 }

정확히 당신이 요구하는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top