win/curses comment
Twice I've gone through the curses code to deal with CHAR_P, BOOLEAN_P, and so forth. Both times I eventually changed my mind. This time I'm just adding an explanatory comment instead.
This commit is contained in:
@@ -17,6 +17,36 @@
|
|||||||
#define strncasecmp strncmpi
|
#define strncasecmp strncmpi
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Note:
|
||||||
|
*
|
||||||
|
* Prototypes need to use the widened/unwidened type macros (CHAR_P, &c)
|
||||||
|
* in order to match fields of the window_procs struct (see winprocs.h).
|
||||||
|
* But for a standard-conforming compiler, we'll end up with the widened
|
||||||
|
* types necessary to match the mixed prototype/old-style function
|
||||||
|
* definition environment as used by nethack's core. Prototype
|
||||||
|
int func(CHAR_P);
|
||||||
|
* becomes
|
||||||
|
int func(int);
|
||||||
|
* after expansion, which matches the definition
|
||||||
|
int func(arg) char arg; { ... }
|
||||||
|
* according to the rules of the C standard. But the use of new-style
|
||||||
|
* definitions
|
||||||
|
int func(char arg) { ... }
|
||||||
|
* by the curses interface turns that into a conflict. No widening takes
|
||||||
|
* place so it ought to be 'int func(char);' instead. Unfortunately that
|
||||||
|
* would be incompatible for functions assigned to window_procs.
|
||||||
|
*
|
||||||
|
* So, the code here (also cursmain.c and cursinvt.c) is mis-using the
|
||||||
|
* widening macros for variable types
|
||||||
|
int func(CHAR_P arg) { ... }
|
||||||
|
* (no doubt modelling it after the C++ code in win/Qt where the option
|
||||||
|
* to switch the applicable definitions to old-style isn't available).
|
||||||
|
* Other alternatives aren't significantly better so just live with it.
|
||||||
|
* [Redoing the windowing interface to avoid narrow arguments would be
|
||||||
|
* better since that would fix Qt's usage too.]
|
||||||
|
*/
|
||||||
|
|
||||||
/* Dialog windows for curses interface */
|
/* Dialog windows for curses interface */
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user