2012-10-01 3 views
0

가능한 경우 함수의 반환 값의 형변환이 전달 된 매개 변수 중 하나에 해당하는 방식에 따라 컴파일러 경고를 생성하는 방법을 알고 싶습니다. 필자의 예에서는 함수 호출이 "Bytes"매개 변수에 의해 정의 된 것보다 적은 형식으로 형변환 된 경우 컴파일러 경고를 생성하려고합니다.사용자 정의 함수 형 변환에서 컴파일러 경고 생성

INT64U GetINTU(INT8U* Address, INT8U Bytes) 
{ 
INT64U Value = 0; 
if(Bytes<=8) 
    { 
    do 
     { 
     Value += ((INT64U)(*Address++))<<(--Bytes<<3); 
     }while(Bytes); 
    } 
return Value; 
} 

EDIT :

여기
(INT16U)GetINTU(VarPtr, 2); // This is ok 
(INT16U)GetINTU(VarPtr, 4); // generates warning 
(INT32U)GetINTU(VarPtr, 4); // This is ok 
(INT32U)GetINTU(VarPtr, 8); // generates warning 
(INT64U)GetINTU(VarPtr, 4); // This is ok 

는 상기 함수이다 : 또한 널 포인터를 리턴 간주하지만, 이는 예를 들어 MSP430

위한 IAR을 이용한 C 프로그램에서 사용 정적 변수가 필요하다는 뜻입니다. 내가하고 싶지 않은 것

답변

1

간단한 대답이 있습니다. 할 수 없습니다. 그 이유는 함수가 반환 된 후에 리턴 값이 타입 변환 될 것을 알 수 없다는 것입니다.

+0

컴파일 타임에 오류가 발생합니다. 캐스트와 "Bytes"의 값을 비교하기를 원합니다. "Bytes"는 항상 하드 코딩 된 숫자로 전달됩니다. 1, 2, 4, 8이고 변수가 될 수 없습니다. 이것이 제가 할 수있는 방법이있을 것이라고 생각한 이유입니다. – Jeremy

+1

@Jeremy C++에서는 템플릿을 사용할 수 있습니다. 아아, 평범한 C가 아니라 매크로를 사용하지 않습니다. –

1

아니요, 불가능합니다. 컴파일러는 컴파일시 출력 값을 결정할만큼 똑똑하지 않습니다. 당신이 할 수있는 한 가지는 다른 리턴 타입을 가진 여러 함수를 제공하고 내부에 어설 션을하는 것입니다 (런타임시 문제를 잡을 것입니다). 물론 임베디드 환경에서 이런 종류의 코드 복제는 좋지 않습니다.

아마도 가장 좋은 방법은 이렇게하는 것입니다 :

#define GetINT8U(addr, bytes) assert(bytes <= 1), (INT8U)GetINTU(addr, bytes) 
#define GetINT16U(addr, bytes) assert(bytes <= 2), (INT16U)GetINTU(addr, bytes) 
#define GetINT32U(addr, bytes) assert(bytes <= 4), (INT32U)GetINTU(addr, bytes) 
#define GetINT64U(addr, bytes) assert(bytes <= 8), (INT64U)GetINTU(addr, bytes) 
+0

컴파일 타임에 오류가 발생합니다. 캐스트와 "Bytes"의 값을 비교하기를 원합니다. "Bytes"는 항상 하드 코딩 된 숫자로 전달됩니다. 1, 2, 4, 8이고 변수가 될 수 없습니다. 이것이 제가 할 수있는 방법이있을 것이라고 생각한 이유입니다. – Jeremy

+0

@ 제레미 C에서 그렇게하는 방법을 알지 못합니다. 아마도이 정의가 무엇인지 알지 못하더라도 정의 안에서 ifdef로 처리하는 이상한 방법이있을 것입니다. #define 안에 #if bytes> 1 #error #endif를 넣을 수 있습니다. 가능한 경우 어떻게 또는 확실하지 않습니다. – CrazyCasta

0

당신은 # 회신 및 # 오류하지만 컴파일 시간을 사용자 정의 경고 또는 오류를 생성 할 수 있습니다. 그래서 이것을 런타임 코드에 적용 할 수 없습니다.

여기에 대한 자세한 설명이 나와 있습니다.