C ++ 매크로에 Newline을 포함시키는 방법 또는 C ++ 템플릿을 사용하여 동일한 작업을 수행하는 방법은 무엇입니까?
-
20-09-2019 - |
문제
다음 질문을 보았습니다.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
}
정확히 당신이 요구하는 것입니다.