- 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
defecate-plusplus 13.06.2012 13:04 # +6
TarasB 13.06.2012 13:31 # +2
Я проверял, можно ли для процедур делать то же, что и для функций - возвращать результат вызова другой функции. Мало ли, он скажет, что для пустых результатов это недопустимо.
geust 13.06.2012 13:36 # −3
И процедур там нет, есть только функции. Эту надо переименовать в helloUB
TarasB 13.06.2012 13:38 # 0
defecate-plusplus 13.06.2012 13:41 # +3
все вызовется как положено
обычное дело
странно, что это стало сюрпризом
geust 13.06.2012 14:13 # 0
defecate-plusplus 13.06.2012 14:16 # +1
TarasB 13.06.2012 14:21 # 0
defecate-plusplus 13.06.2012 14:27 # +1
первая запись удобнее, когда происходит
что явно симпатичнее, чем
TarasB 13.06.2012 15:11 # 0
defecate-plusplus 13.06.2012 15:13 # +2
TarasB 13.06.2012 15:16 # 0
defecate-plusplus 13.06.2012 15:20 # +1
но в подавляющем большинстве случаев шаблонные типы выводятся из аргументов (которых у тебя нет) и потому явного указания не требуют
TarasB 13.06.2012 15:23 # 0
Вот смотри, под маздайкой главфункция возвращает int, под андрюшкой void, дальше, внутри главфункции сразу вызвается return RunApp(APP_PARAMS), которое имеет свою реализацию для и андрюшки, и маздайки. Тут на шаблонах не сделать, только препроцессором.
defecate-plusplus 13.06.2012 15:29 # 0
или ты мне про какие то непреодолимые разногласия в api?
они должны разруливаться api-wrapper, да, не без препроцессора - чтобы совсем сокрыть чужеродный код от компилятора, который его не поймет, но на уровне использования всё должно выглядеть единообразно, тонкости реализации (и в т.ч. что конкретно возвратит тот или иной апи вызов) не должны вылезти за интерфейс этого враппера
TarasB 13.06.2012 15:32 # 0
На уровне использования всё выглядит как просто возврат значения, возвращаемого внутренней функцией.
Для андрюшки это значение имеет тип void.
defecate-plusplus 13.06.2012 15:37 # 0
ну а RunApp сможешь объявить как void на обеих платформах
или тривиальней:
http://ideone.com/e0WnS
TarasB 13.06.2012 15:46 # 0
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'
"Или тривиальнее" - и как это написать кроссплатформенно, на засунув препроцессор поглубже?
bormand 13.06.2012 15:52 # 0
Или даже, возможно, подумать о двух модулях main_android и main_win, из которых на каждой платформе будет собираться только один.
Если же runApp отличаются только возвращаемым значением - то пускай runApp всегда возвращает int. А выбранный препроцессором main уже разберется - возвращать ему это значение или просто выкинуть его.
TarasB 13.06.2012 15:57 # 0
И требование - отсутствие препроцессора в главном файле.
bormand 13.06.2012 16:03 # 0
[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 разных файла, которые будут выбираться системой сборки?
TarasB 13.06.2012 16:10 # 0
Это значит, что каждый раз при написании новой программы я буду по новой городить вот это вот #if и так далее...
И препроцессор в главном файле это уродливо и ваще. Вот я даже руководство "как использовать SDL под андрюшку читаю", и там пишут "а для андрюшки главный файл надо будет слегка переписать вот так-то", но это же тьфу, криво как-то.
bormand 13.06.2012 16:16 # +1
TarasB 13.06.2012 16:18 # 0
И как этот макрос вызывать? Где обработчики выставлять?
bormand 13.06.2012 16:27 # 0
TarasB 13.06.2012 16:31 # 0
bormand 13.06.2012 16:36 # +1
За каким х.ем он его содержит?
Какие файлы компилировать, а какие нет - настроите в проектах\мейкфайлах\что-там-у-вас.
TarasB 13.06.2012 16:41 # 0
bormand 13.06.2012 16:43 # 0
Обработчики чего?
TarasB 13.06.2012 16:44 # 0
bormand 13.06.2012 16:45 # 0
TarasB 13.06.2012 16:51 # 0
pushkoff 15.06.2012 21:05 # +1
TarasB 15.06.2012 21:44 # 0
defecate-plusplus 13.06.2012 16:02 # +1
если уж делать два файла - пускай разбирается система сборки (даже в том же студийном проекте можно для разных конфигураций задать компилировать этот cpp или исключить из построения)
TarasB 13.06.2012 16:11 # 0
defecate-plusplus 13.06.2012 16:17 # +1
тебе нужно 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
bormand 13.06.2012 16:12 # +1
bormand 13.06.2012 16:31 # +3
absolut 15.06.2012 12:43 # 0
geust 13.06.2012 14:38 # 0
vistefan 13.06.2012 15:21 # +3
3.14159265 13.06.2012 18:04 # +1
Быстрое нынче Гумно пошло - резкое как понос.
sayidandrtfm 13.06.2012 14:32 # +6
gcc-4.5 -std=gnu99 -Wextra -Wall -pedantic-errors
error: ISO C forbids ‘return’ with expression, in function returning void
defecate-plusplus 13.06.2012 14:41 # +1
С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.
bormand 13.06.2012 14:53 # 0
defecate-plusplus 13.06.2012 14:58 # 0
мне кажется вполне здравым пользоваться таким return a(); даже не в шаблонах и не стыдиться этого
roman-kashitsyn 13.06.2012 15:02 # +2
defecate-plusplus 13.06.2012 15:10 # 0
да и не факт, что возможность получения вычисленного значения из if/case, for/while/do врядли бы сделала с++ более
> удобным для понимания
bormand 13.06.2012 15:12 # +1
3.14159265 13.06.2012 18:02 # +1
Сучата. Тоже ощущение костыльности и бесполезности типа из-за небходимости возврата этого самого null.
Lure Of Chaos 13.06.2012 23:28 # +1
TheCalligrapher 14.06.2012 00:36 # +4