Article View: pl.comp.lang.c
Article #309945Re: Błąd preprocesora czy czegoś nie rozumiem?
From: PawelS pawel(at)wbcd(dot)pl
Date: Wed, 09 Oct 2019 16:57
Date: Wed, 09 Oct 2019 16:57
51 lines
2731 bytes
2731 bytes
M.M. pisze:
> On Thursday, October 3, 2019 at 11:36:18 PM UTC+2, PawelS pawel(at)wbcd(dot)pl wrote:
>> M.M. pisze:
>>> Witam
>>>
>>> Jest sobie poniższy program i działa:
>>>
>>> #define TEST1( __x__ ) int __x__ = __LINE__
>>> #define TEST2( __x__ ) int __x__ ## __LINE__ = 0
>>>
>>> int main(int argc, char *argv[]) {
>>> TEST1( x );
>>> printf( "%d\n" , x );
>>> // TEST2( y );
>>> // TEST2( y );
>>> return 0;
>>> }
>>>
>>> Jednak jak odkomentuję dwie line:
>>> // TEST2( y );
>>> // TEST2( y );
>>>
>>> to już mam błąd:
>>>
>>> redeclaration of 'int y__LINE__'
>>> TEST2( y );
>>> ^
>>>
>>> Od czego zależy kiedy rozwija makro __LINE__ a kiedy nie?
>> Powyższy błąd nie ma nic wspólnego z "rozwija makro".
>> Spróbuj sam się wczuć w rolę preprocesora i podstaw sobie makro.
>> Powyższy problematyczny zapis jak dla mnie (mogę się mylić)
>> po ... (nie wiem jak to nazwać) przy kompilacji może wyglądać tak:
>>> // TEST2( y );
>>> // TEST2( y );
>>> #define TEST2( __x__ ) int __x__ ## __LINE__ = 0
>> int __y__ ## __LINE__ = 0;
>> int __y__ ## __LINE__ = 0;
>> niech mnie ktoś poprawi, ale to wygląda trochę jak
>> podwójna deklaracja tej samej zmiennej,
>> albo już zbyt zmęczony jestem ...
>
> Ok, ale dlaczego (zgodnie z oczekiwaniami) działa makro TEST1?
Makro TEST1 tylko dlatego, że występuje w kodzie tylko 1 raz.
Sprawdzałeś ? Czy zadziała gdy będzie występować 2 razy ?
TEST1( x );
TEST1( x );
a.c:9: error: redefinition of ‘x’
a.c:8: error: previous definition of ‘x’ was here
Technical Details
Message-ID:
<5d9e1177$0$511$65785112@news.neostrada.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!goblin1!goblin.stu.neva.ru!newsfeed.neostrada.pl!unt-exc-01.news.neostrada.pl!unt-spo-a-02.news.neostrada.pl!news.neostrada.pl.POSTED!not-for-mailReferences:
<780a7f39-337b-4b6b-810f-7c4151e10f74@googlegroups.com> <5d9669cf$0$543$65785112@news.neostrada.pl> <88bd1fd1-2d3a-499f-9479-f56a3f36788a@googlegroups.com>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!goblin1!goblin.stu.neva.ru!newsfeed.neostrada.pl!unt-exc-01.news.neostrada.pl!unt-spo-a-02.news.neostrada.pl!news.neostrada.pl.POSTED!not-for-mail Date: Wed, 09 Oct 2019 18:57:10 +0200 From: "PawelS pawel(at)wbcd(dot)pl" <fake@email.org> User-Agent: Thunderbird 2.0.0.18 (X11/20081120) MIME-Version: 1.0 Newsgroups: pl.comp.lang.c Subject: Re: Błąd preprocesora czy czegoś nie rozumiem? References: <780a7f39-337b-4b6b-810f-7c4151e10f74@googlegroups.com> <5d9669cf$0$543$65785112@news.neostrada.pl> <88bd1fd1-2d3a-499f-9479-f56a3f36788a@googlegroups.com> In-Reply-To: <88bd1fd1-2d3a-499f-9479-f56a3f36788a@googlegroups.com> Lines: 51 Message-ID: <5d9e1177$0$511$65785112@news.neostrada.pl> Organization: Telekomunikacja Polska NNTP-Posting-Host: 89.231.96.70 X-Trace: 1570640249 unt-rea-b-01.news.neostrada.pl 511 89.231.96.70:56087 X-Complaints-To: abuse@news.neostrada.pl Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit