최근 의견을 감안할 때 함수 호출 하나당 하나의 추가 인수 (함수의 "유형")를 전달하여 수행하려는 작업을 수행 할 수 있다고 생각합니다. 예를 들어, 발생할 것의 당신이 모든 기능 유형의리스트를 만들어 가정하자 :
enum funcType {
V_U8_U16_U8, // Means: void func(uint8_t, uint16_t, uint8_t)
V_U16_U16, // Means: void func(uint16_t, uint16_t)
U32_U32, // Means: uint32_t func(uint32_t)
...
}
그런 다음 호스트 측에, 당신은 다른 정보와 함께 funcType를 전송할 수 있습니다. 목표면에서 다음과 같이해야합니다.
type = GetFunctypeFromStream();
switch(type) {
case V_U8_U16_U8:
{
void (*func)(uint8_t, uint16_t, uint8_t) = GetFuncPointerFromStream();
uint8_t arg1 = GetU8ArgFromStream();
uint16_t arg2 = GetU16ArgFromStream();
uint8_t arg3 = GetU8ArgFromStream();
func(arg1, arg2, arg3);
break;
}
case V_U16_U16:
{
void (*func)(uint16_t, uint16_t) = GetFuncPointerFromStream();
uint16_t arg1 = GetU16ArgFromStream();
uint16_t arg2 = GetU16ArgFromStream();
func(arg1, arg2);
break;
}
case U32_U32:
{
uint32_t (*func)(uint32_t) = GetFuncPointerFromStream();
uint32_t arg1 = GetU32ArgFromStream();
ret = func(arg1);
break;
}
...
}
물론 위의 내용을 모두 손으로 쓰지는 않을 것입니다. 각 사례를 생성하는 스크립트를 작성하여 해당 코드를 자동으로 생성 할 수 있습니다.또한 함수를 호출하는 것과 관련하여 실제로는 중요하지 않기 때문에 서명 된 유형과 부호없는 유형을 하나의 유형으로 병합 할 수 있습니다.
이 솔루션은 함수 유형 수가 함수 수보다 훨씬 작은 한 도움이됩니다. 모든 함수가 다른 유형이라면 기본적으로 모든 함수를 switch 문으로 사용하기 때문에 (이 함수는 피하고 싶다고 말했던 것처럼) 도움이되지 않습니다.
출처
2014-12-05 00:56:58
JS1
전혀합니다. 문제는 스택과 레지스터에 넣는 방법을 모르는 것입니다. 또는 함수에서 알 수없는 호출 규칙이 무엇이든간에. – Deduplicator
당신은 함수가 취하는 인수의 개수를 알지 못한다고 말하면서 3 개의 인자, 즉 byte, short, byte를 취한다. 함수에 대한 typedef를 선언 한 다음 함수의 주소를 해당 유형의 함수에 대한 포인터로 캐스팅하고 지정한 매개 변수를 사용하여 함수를 호출 할 수 있습니다. – rcgldr
이것은 배열을 설명하는 예제 함수입니다. 배열과 함수의 주소 만 있으면됩니다. 이 함수가 얼마나 많은 인수 또는 어떤 종류의 데이터 형식을 기대하는지에 대해서는 알지 못합니다. –