- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
void a()
{
}
void b()
{
return a();
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
−51
void a()
{
}
void b()
{
return a();
}
Компилится.
http://ideone.com/8eP1w
Я проверял, можно ли для процедур делать то же, что и для функций - возвращать результат вызова другой функции. Мало ли, он скажет, что для пустых результатов это недопустимо.
И процедур там нет, есть только функции. Эту надо переименовать в helloUB
все вызовется как положено
обычное дело
странно, что это стало сюрпризом
первая запись удобнее, когда происходит
что явно симпатичнее, чем
но в подавляющем большинстве случаев шаблонные типы выводятся из аргументов (которых у тебя нет) и потому явного указания не требуют
Вот смотри, под маздайкой главфункция возвращает int, под андрюшкой void, дальше, внутри главфункции сразу вызвается return RunApp(APP_PARAMS), которое имеет свою реализацию для и андрюшки, и маздайки. Тут на шаблонах не сделать, только препроцессором.
или ты мне про какие то непреодолимые разногласия в api?
они должны разруливаться api-wrapper, да, не без препроцессора - чтобы совсем сокрыть чужеродный код от компилятора, который его не поймет, но на уровне использования всё должно выглядеть единообразно, тонкости реализации (и в т.ч. что конкретно возвратит тот или иной апи вызов) не должны вылезти за интерфейс этого враппера
На уровне использования всё выглядит как просто возврат значения, возвращаемого внутренней функцией.
Для андрюшки это значение имеет тип void.
ну а RunApp сможешь объявить как void на обеих платформах
или тривиальней:
http://ideone.com/e0WnS
c:\Users\TarasB\Documents\Visual Studio Projects\Test_Krestoproject\Test_Krestop roject.cpp(4): error C2371: 'WinMain' : redefinition; different basic types
c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\PlatformSDK\Include\WinBase.h(1 574) : see declaration of 'WinMain'
"Или тривиальнее" - и как это написать кроссплатформенно, на засунув препроцессор поглубже?
Или даже, возможно, подумать о двух модулях main_android и main_win, из которых на каждой платформе будет собираться только один.
Если же runApp отличаются только возвращаемым значением - то пускай runApp всегда возвращает int. А выбранный препроцессором main уже разберется - возвращать ему это значение или просто выкинуть его.
И требование - отсутствие препроцессора в главном файле.
[code=c++]
#ifdef WE_ARE_ON_ANDROID
int runApp(...args...) {
... runApp for android ...
}
void main()
{
runApp(...);
}
#else
int runApp(...args...) {
... runApp for win32 ...
}
int main()
{
return runApp(...);
}
#endif
> И требование - отсутствие препроцессора в главном файле.
А в чем причина, если не секрет?
ПыСы: если они совсем разные - ну может правда сделать 2 разных файла, которые будут выбираться системой сборки?
Это значит, что каждый раз при написании новой программы я буду по новой городить вот это вот #if и так далее...
И препроцессор в главном файле это уродливо и ваще. Вот я даже руководство "как использовать SDL под андрюшку читаю", и там пишут "а для андрюшки главный файл надо будет слегка переписать вот так-то", но это же тьфу, криво как-то.
И как этот макрос вызывать? Где обработчики выставлять?
За каким х.ем он его содержит?
Какие файлы компилировать, а какие нет - настроите в проектах\мейкфайлах\что-там-у-вас.
Обработчики чего?
если уж делать два файла - пускай разбирается система сборки (даже в том же студийном проекте можно для разных конфигураций задать компилировать этот cpp или исключить из построения)
тебе нужно main_win.cpp, main_android.cpp, app_win.cpp, app_android.cpp
последние два отвечают единому интерфейсу app.hpp (если и интерфейс app у тебя разный, то опять же app_{win,android}.hpp - по мере распухания различий я бы посоветовал завести параллельные папки win32/ и android/, куда класть уже нормальные main.cpp, app.cpp, etc - в студии есть фильтры, которые можно вручную заводить так, чтобы они соответствовали структуре папок)
в системе сборки для конфигурации win32 для *_android.cpp выставляешь "исключить из построения"
done
Быстрое нынче Гумно пошло - резкое как понос.
gcc-4.5 -std=gnu99 -Wextra -Wall -pedantic-errors
error: ISO C forbids ‘return’ with expression, in function returning void
С11-n1548:
6.8.6.4 The return statement
Constraints
1. A return statement with an expression shall not appear in a function whose return type is void. A return statement without an expression shall only appear in a function whose return type is void.
стандарт С++ в этом плане более мягкий:
6.6.3 The return statement
3 A return statement with an expression of type “cv void” can be used only in functions with a return type of cv void; the expression is evaluated just before the function returns to its caller.
мне кажется вполне здравым пользоваться таким return a(); даже не в шаблонах и не стыдиться этого
да и не факт, что возможность получения вычисленного значения из if/case, for/while/do врядли бы сделала с++ более
> удобным для понимания
Сучата. Тоже ощущение костыльности и бесполезности типа из-за небходимости возврата этого самого null.