2011-10-20 4 views
1

나는 있었고, 이후 수정 한 다음 코드 같은 :implict 반환 값에 대한 GCC 확장이 있습니까?

class SomeClass { 
public: 
    static int AdjustValue(float input); 
    static int DoSomethingWithAdjustedValue(int adjustedInput); 
    static int DoSomethingWithNormalValue(float input) { 
     DoSomethingWithAdjustedValue(AdjustValue(input);} 
}; 

그래서 DoSomethingWithNormalValue가 명확하게 return 누락,하지만 GCC 오류 또는 그것에 대한 경고를 생성하지 않았다. 그리고 내가 DoSomethingWithNormalValue이라고 부르는 장소는 올바른 리턴 코드를 얻고있었습니다. 나는이 두 가지 설명을 생각할 수 있습니다 : 다른 기능을 래핑 인라인 기능을 인식하고 함께 반환 값을 통과 GCC의 일부 확장이 있습니다

  1. .

  2. 오류 또는 경고를 방지하는 GCC의 버그와 결합 된 정의되지 않은 동작의 행운/불행한 표현으로 인해 반환 코드가 전달되었습니다.

나는 이들 중 어느 것도 나를 공격하지 않습니다. 여기서 무슨 일이 일어나고있는거야?

+1

경고 수준이 높아집니다. 그것은 당신에게 경고 할 것입니다. –

+0

'return' 문을 놓쳤을 때 "올바른 반환 코드"란 무엇입니까? –

+0

@Blagovest 0으로 가정합니다. –

답변

3

시도 :

리턴 코드 때문에 오류 또는 경고를 방지 GCC의 버그와 함께 정의되지 않은 동작의 불운/운이 표현의 전가되고 있었다
> g++ xa1.cpp -Wall 
xa1.cpp: In static member function ‘static int SomeClass::DoSomethingWithNormalValue(float)’: 
xa1.cpp:8: warning: no return statement in function returning non-void 
xa1.cpp:8: warning: control reaches end of non-void function 

.

나는 이것이 어떻게되는지를 알 것입니다.
기술적으로 정의되지 않은 동작입니다.

+0

이것이 x86 인 경우, 그는 덮어 쓰지 않으면 이전 함수의 반환 코드를 운 좋게 유지하는'eax'의 이전 값을 읽었을 것입니다. –

+0

그건 가장 근사한 일입니다. 나는 "컨트롤이 비공 유 기능의 끝에 도달했습니다"라는 팝업이 나오기 전에 맹세 할 수있었습니다. 하지만 빌드 설정을 두 번 확인 했으므로 옳습니다. 도! – IronMensan

4

C++에는 진단이 필요하지 않지만 정의되지 않은 동작입니다.

DoSomethingWithAdjustedValue 것 반환 값은 이동 반환 값을 배치 한 다음 DoSomethingWithNormalValue 모든 반환 값 덤비는되지 않으므로 반환 값을 찾습니다 아무것도 그들이 DoSomethingWithNormalValue를 호출 한 후 때문에 정확한 값을 얻고있는 이유는 DoSomethingWithAdjustedValue에 의해 반환 된 값을 참조하십시오.

관련 문제