[Freeciv-Dev] Re: (PR#2521) general effects framework
[Top] [All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index] [Thread Index]
<URL: http://rt.freeciv.org/Ticket/Display.html?id=2521 >
Yes, you are right on this with a minor elaboration.
The standard here is that by passing in the variable you expose it to
the user outside the macro so in the iterator it can be legitimately
used. The macro writer guarantees not to change it in the future.
If you added underbars, then it would suggest it shouldn't be used as
the macro writer has reserved it as something that might be changed
without warning in a future update.
Cheers,
RossW
=====
Jason Short wrote:
> <URL: http://rt.freeciv.org/Ticket/Display.html?id=2521 >
>
> rwetmore@xxxxxxxxxxxx wrote:
>
>><URL: http://rt.freeciv.org/Ticket/Display.html?id=2521 >
>>
>>
>>Huh?
>>
>>If the macro codes a replacement variable pcity, that would cause a
>>lot of problems if someone accidently dropped a variable declaration
>>or other scoping tweak that normally overrode it or the like.
>>
>>It also leads to confusion when trying to actually use a local variable
>>in iterator like context, i.e. not self-contained macro but one with
>>several parts. Making this have the same style is just better coding
>>so no one needs to think twice about what is local the macro and what
>>is not depending on whether the macro is currently self-contained or not.
>>
>>The rule ... Anything used totally within the macro context should use
>>internal not external naming conventions. Anything with an underbar is
>>*not* then legally visible/usable by the programmer outside of the macro.
>
>
> This doesn't apply to the macro's variables. For instance the following
> works exactly like it should
>
> #define iterate(i) { \
> int i; \
> for (i = 0; i < 10; i++) {
>
> void main()
> {
> int i = 100;
>
> iterate(j) {
> printf("%d\n", i + j);
> } } }
> }
>
> Adding underscores to these parameters isn't useful at all and conforms
> to no current standard (a lot of iterators do use weird naming for their
> arguments, but there is no *standard*).
>
> For variables used entirely inside the macro, you are right. The
> following does not work properly (and in fact won't even compile). The
> macro should use value _j rather than j. The difference is that this
> value is not a macro argument and is therefore used exactly the way it's
> written in the macro.
>
> #define iterate(i) \
> { \
> int i, j; \
> for (j = 0; j < 10; j++) \
> for (i = 0; i < j; i++) {
>
> void main()
> {
> int i = 100;
>
> iterate(j) {
> printf("%d\n", j);
> } } }
> }
>
> jason
|
|