Есть ли расширение GCC для возвращаемых значений импликов? - PullRequest
1 голос
/ 21 октября 2011

Я имел и с тех пор исправил что-то вроде следующего кода:

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, получали правильный код возврата.Я могу придумать два объяснения этому:

  1. В GCC есть некоторое расширение, которое распознает встроенные функции, которые обертывают другие функции и передает возвращаемые значения.

  2. Код возврата передавался из-за удачного / неудачного проявления неопределенного поведения в сочетании с ошибкой в ​​GCC, которая предотвращала любую ошибку или предупреждение.

Ни один из этихпорази меня как вероятность.Что здесь происходит?

Ответы [ 2 ]

4 голосов
/ 21 октября 2011

C ++ не требует диагностики для этого, но это неопределенное поведение.

Причина, по которой вы получаете правильное значение, заключается в том, что DoSomethingWithAdjustedValue помещает свое возвращаемое значение туда, куда возвращаются значения, а затем DoSomethingWithNormalValue не связывается ни с какими возвращаемыми значениями, поэтому все, что ищет возвращаемое значение после вызов DoSomethingWithNormalValue увидит значение, возвращаемое DoSomethingWithAdjustedValue.

3 голосов
/ 21 октября 2011

try:

> 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

Код возврата передавался из-за счастливого / неудачного проявления неопределенного поведения в сочетании с ошибкой в ​​GCC, которая предотвращала любую ошибку или предупреждение.

Я думаю, вы обнаружите, что именно так и происходит.
Технически это неопределенное поведение.

...