🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.c
Article #309941

Re: Błąd preprocesora czy czegoś nie rozumiem?

#309941
From: Maciek Godek
Date: Fri, 04 Oct 2019 08:06
79 lines
4295 bytes
W dniu piątek, 4 października 2019 01:32:29 UTC+2 użytkownik M.M. napisał:

> > Sory coś mi się posrało CRLF. W każdym razie jak zrobisz
> > 
> > #define TEST2__( __x__  , __l__ ) int __x__  ## __l__ = 0
> > #define TEST2_( __x__, __l__ ) TEST2__( __x__, __l__)
> > #define TEST2( __x__ ) TEST2_(__x__  , __LINE__)
> > 
> > to powinno być raczej git.
> > 
> > W każdym razie
> > 
> > /* u mnie działa */
> 
> Nie rozumiem, ale u mnie też działa. Dziękuję za pomoc.
> Pozdrawiam

No to już wyjaśniam.

Powinno być jasne, że jeżeli zdefiniujemy makro

#define TEST3(__x__) int __x__ ## __LINE__

i napiszemy

TEST3(x)

to rozwinie Ci się to do

int __x____LINE__

no bo jak inaczej mógłbyś dokleić identyfikator __LINE__ do swojej zmiennej w makrze?

Jeżeli z kolei napiszemy

#define TEST3__( __x__  , __l__ ) int __x__  ## __l__
#define TEST3( __x__ ) TEST3__(__x__, __LINE__)

to teraz jak napiszesz

TEST3(x)

to zachowanie makra będzie zależeć od tego, czy preprocesor rozwija argumenty przed, czy po rozwinięciu makra (chodzi nam w szczególności o argument __LINE__)

Jeżeli rozwija je po rozwinięciu makra (i na to wygląda), to efekt będzie taki sam, jak wcześniej, bo algorytm jest z grubsza taki:

1. rozwiń makro z definicji (===>)
2. rozwiń wszystkie użyte argumenty (--->)
3. jeżeli wyrażenie zawiera jeszcze jakieś symbole preprocesora, kontynuuj ekspansję

Czyli mamy

1. TEST3(x) ===> TEST3_(x, __LINE__)
2. TEST3__(x, __LINE__) ---> TEST3__(x, __LINE__)
(jedynym argumentem do TEST3 był x, który nie jest symbolem preprocesora.
Ale gdyby był, to na tym etapie zostałby zamieniony)
3. TEST3__(x, __LINE__) ===> int x__LINE__

Za to jeśli sobie zdefiniujemy

#define TEST2__( __x__  , __l__ ) int __x__  ## __l__ = 0
#define TEST2_( __x__, __l__ ) TEST2__( __x__, __l__)
#define TEST2( __x__ ) TEST2_(__x__  , __LINE__) 

i napiszemy

TEST2(x)

to ekspansja przebiegnie następująco:

1. TEST2(x) ===> TEST2_(x, __LINE__)
2. TEST2_(x, __LINE__) ---> TEST2_(x, __LINE__)
3. TEST2_(x, __LINE__) ===> TEST2__(x, __LINE__)
4. TEST2__(x, __LINE__) ---> TEST2__(x, 7)
(bo dokonaliśmy właśnie ekspansji argumentu)
5. TEST2__(x, 7) ===> int x7
6. żaden z argumentów nie występuje w rozwinięciu

HTH
Technical Details
Message-ID: <97cf938b-a91f-4338-a9e9-86a43f6fa9ec@googlegroups.com>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!news-1.dfn.de!news.dfn.de!news.uni-stuttgart.de!news.unit0.net!feeds.phibee-telecom.net!newsfeed.xs4all.nl!newsfeed8.news.xs4all.nl!85.12.16.69.MISMATCH!peer02.ams1!peer.ams1.xlned.com!news.xlned.com!peer02.am4!peer.am4.highwinds-media.com!peer02.iad!feed-me.highwinds-media.com!news.highwinds-media.com!o24no5295648qtl.0!news-out.google.com!x7ni755qtf.0!nntp.google.com!o24no5295645qtl.0!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mail
References: <780a7f39-337b-4b6b-810f-7c4151e10f74@googlegroups.com> <f1c8f951-ad5b-4fca-8e58-2fb7a4850aaa@googlegroups.com> <1abb73f5-4326-419c-a08d-499fbef10226@googlegroups.com> <ed39a49f-5fa2-4573-a688-08b160d397d4@googlegroups.com> <b3fd150a-5c5e-43e5-b2dd-fd6aa2e473c5@googlegroups.com> <eadc4036-ff10-426a-9622-07f2db5c8a38@googlegroups.com> <8cb008b2-0f5d-40e5-bffa-594c77205a76@googlegroups.com>

Show Full Headers
Complete Article Headers
X-Received: by 2002:aed:32c6:: with SMTP id z64mr14198174qtd.202.1570176409564;        Fri, 04 Oct 2019 01:06:49 -0700 (PDT)
X-Received: by 2002:a25:aac3:: with SMTP id t61mr1053915ybi.201.1570176409267; Fri, 04 Oct 2019 01:06:49 -0700 (PDT)
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!news-1.dfn.de!news.dfn.de!news.uni-stuttgart.de!news.unit0.net!feeds.phibee-telecom.net!newsfeed.xs4all.nl!newsfeed8.news.xs4all.nl!85.12.16.69.MISMATCH!peer02.ams1!peer.ams1.xlned.com!news.xlned.com!peer02.am4!peer.am4.highwinds-media.com!peer02.iad!feed-me.highwinds-media.com!news.highwinds-media.com!o24no5295648qtl.0!news-out.google.com!x7ni755qtf.0!nntp.google.com!o24no5295645qtl.0!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mail
Newsgroups: pl.comp.lang.c
Date: Fri, 4 Oct 2019 01:06:48 -0700 (PDT)
In-Reply-To: <8cb008b2-0f5d-40e5-bffa-594c77205a76@googlegroups.com>
Complaints-To: groups-abuse@google.com
Injection-Info: glegroupsg2000goo.googlegroups.com; posting-host=83.25.250.157; posting-account=f7iIKQoAAAAkDKpUafc-4IXhmRAzdB5r
NNTP-Posting-Host: 83.25.250.157
References: <780a7f39-337b-4b6b-810f-7c4151e10f74@googlegroups.com> <f1c8f951-ad5b-4fca-8e58-2fb7a4850aaa@googlegroups.com> <1abb73f5-4326-419c-a08d-499fbef10226@googlegroups.com> <ed39a49f-5fa2-4573-a688-08b160d397d4@googlegroups.com> <b3fd150a-5c5e-43e5-b2dd-fd6aa2e473c5@googlegroups.com> <eadc4036-ff10-426a-9622-07f2db5c8a38@googlegroups.com> <8cb008b2-0f5d-40e5-bffa-594c77205a76@googlegroups.com>
User-Agent: G2/1.0
MIME-Version: 1.0
Message-ID: <97cf938b-a91f-4338-a9e9-86a43f6fa9ec@googlegroups.com>
Subject: Re: Błąd preprocesora czy
 czegoś nie rozumiem?
From: Maciek Godek <godek.maciek@gmail.com>
Injection-Date: Fri, 04 Oct 2019 08:06:49 +0000
X-Received-Bytes: 4364
X-Received-Body-CRC: 1370115719
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit