[aspectc-user] Automatic #include insertion
Panu Bloigu
panu.bloigu at gmail.com
Wed Apr 2 10:22:23 CEST 2008
Hello.
> test.hh:
> class test {};
This should probably be with the capital 'T':
test.hh:
class Test{};
---
I quickly tested your code and found out that when ac++ generates the
test.acc file, the declaration 'extern char a' is inserted to that file
a few lines after the definition of the method Test::test(). This means
that the variable 'a' isn't yet visible in the method Test::test().
.acc files are the output of ac++ compiler. They can then be fed to your
regular C++ compiler. I've found that it's sometimes very useful to take
a look at the generated .acc files to see if the problem is in the code
generated by ac++ and not in your own code. If you already didn't know
this, the ag++ wrapper for ac++ deletes the .acc files after they have
been processed by your C++ compiler, but you can instruct ag++ to leave
them lying around with the option --keep_acc (in the SVN version this
option seems to have been replaced with --keep_woven, or something
similar).
So as a conclusion, I suspect that there's a problem with the code
generated by ac++. The AspectC++ compiler devs on this list might want
to check this out. Just for reference, there's this code in test.acc,
beginning at line 71:
============================
class Test{ friend class ::Test1;
private:
public : static void test ( void )
{
std :: cout << "In Test::test ()" << std :: endl ;
std :: cout << "a = " << a << std :: endl ;
} ;};
#endif /*TEST_HH_*/
#endif //
__ac_guard_C__Documents32and32Settings_work_Desktop_temp_Rojekti_test_hh__
#ifndef A_HH_
#define A_HH_
extern char a;
#endif /*A_HH_*/
============================
I gave the --no_line option for ac++ to see error messages with line
numbers of the .acc files instead of line numbers of the original source
files.
> test.cc:
> int main ( int argc, char** argv ) { return 0; }
>
> a.hh:
> extern char a;
>
> a.cc:
> #include "a.hh"
> char a = 'H';
>
> test.ah:
> #include <iostream>
> #include "test.hh"
> #include "a.hh"
>
> aspect Test1
> {
> advice "Test" : slice class
> {
> public : static void test ( void )
> {
> std::cout << "In Test::test ()" << std::endl;
> std::cout << "a = " << a << std::endl;
> };
> };
> advice execution ( "% main ( ... )" ) : before ()
> {
> Test::test ();
> };
> };
>
> Here the test.hh include (for the Test class) is inserted automatically
> (can be tested by removing the "a = "... line from the aspect) while the
> a.hh include is not. In this example this leads to "error: 'a' was not
> declared in this scope".
>
> Can anyone confirm this or am I doing something wrong here? Is this
> behavior by a special purpose?
> In the given example the consequence was, that I have to add the
> #include line to the test.cc permanently, independently of whether I use
> this aspect or not.
> Best regards
>
> Arnd-Hendrik
>
>
> _______________________________________________
> aspectc-user mailing list
> aspectc-user at aspectc.org
> http://www.aspectc.org/mailman/listinfo/aspectc-user
More information about the aspectc-user
mailing list