#LyX 2.4 created this file. For more info see https://www.lyx.org/
\lyxformat 620
\begin_document
\begin_header
\save_transient_properties true
\origin unavailable
\textclass ../ac-manual
\use_default_options false
\begin_modules
tcolorbox
\end_modules
\maintain_unincluded_children no
\language english
\language_package default
\inputencoding auto-legacy
\fontencoding auto
\font_roman "times" "default"
\font_sans "helvet" "default"
\font_typewriter "courier" "default"
\font_math "auto" "auto"
\font_default_family sfdefault
\use_non_tex_fonts false
\font_sc false
\font_roman_osf false
\font_sans_osf false
\font_typewriter_osf false
\font_sf_scale 100 100
\font_tt_scale 100 100
\use_microtype false
\use_dash_ligatures false
\graphics default
\default_output_format default
\output_sync 0
\bibtex_command default
\index_command default
\float_placement class
\float_alignment class
\paperfontsize 12
\spacing onehalf
\use_hyperref true
\pdf_title "AC++ Compiler Manual"
\pdf_author "\\textcopyright\\ Olaf Spinczyk and pure-systems GmbH"
\pdf_subject "Documentation"
\pdf_keywords "AOP, AspectC++, ac++, pure-systems"
\pdf_bookmarks true
\pdf_bookmarksnumbered false
\pdf_bookmarksopen false
\pdf_bookmarksopenlevel 1
\pdf_breaklinks false
\pdf_pdfborder false
\pdf_colorlinks true
\pdf_backref false
\pdf_pdfusetitle true
\pdf_quoted_options "urlcolor=blue"
\papersize a4
\use_geometry true
\use_package amsmath 1
\use_package amssymb 1
\use_package cancel 1
\use_package esint 0
\use_package mathdots 1
\use_package mathtools 1
\use_package mhchem 1
\use_package stackrel 1
\use_package stmaryrd 1
\use_package undertilde 1
\cite_engine basic
\cite_engine_type default
\biblio_style plain
\use_bibtopic false
\use_indices false
\paperorientation portrait
\suppress_date false
\justification true
\use_refstyle 0
\use_formatted_ref 0
\use_minted 0
\use_lineno 0
\index Index
\shortcut idx
\color #008000
\end_index
\leftmargin 2.5cm
\topmargin 3cm
\rightmargin 3.5cm
\bottommargin 4cm
\secnumdepth 3
\tocdepth 3
\paragraph_separation indent
\paragraph_indentation default
\is_math_indent 0
\math_numbering_side default
\quotes_style english
\dynamic_quotes 0
\papercolumns 1
\papersides 2
\paperpagestyle fancy
\tablestyle default
\tracking_changes false
\output_changes false
\change_bars false
\postpone_fragile_content false
\html_math_output 0
\html_css_as_file 0
\html_be_strict false
\docbook_table_output 0
\docbook_mathml_prefix 1
\end_header

\begin_body

\begin_layout Title

\emph on
AC++ Compiler Manual
\end_layout

\begin_layout Author

\size largest
The AspectC++ Developers
\begin_inset VSpace 3mm
\end_inset


\begin_inset Newline newline
\end_inset


\size default
Version 2.5
\end_layout

\begin_layout Standard
\begin_inset CommandInset toc
LatexCommand tableofcontents

\end_inset


\begin_inset ERT
status collapsed

\begin_layout Plain Layout


\backslash
clearpage
\end_layout

\end_inset


\end_layout

\begin_layout Section

\family sans
\begin_inset CommandInset label
LatexCommand label
name "sec:Introduction"

\end_inset


\family default
Introduction
\end_layout

\begin_layout Standard
The program 
\family typewriter
ac++
\family default
 is a compiler for the AspectC++ programming language.
 It is implemented as a preprocessor that transforms AspectC++ code into ordinary C++ code.
 During this transformation aspect code,
 which is defined by aspects,
 is woven statically into the component code.
 Aspects are a special AspectC++ language element,
 which can be used to implement crosscutting concerns in separate modules.
 Aspect definitions have to be implemented in special 
\begin_inset Quotes eld
\end_inset

aspect header files
\begin_inset Quotes erd
\end_inset

,
 which normally have the filename extension 
\begin_inset Quotes eld
\end_inset

.ah
\begin_inset Quotes erd
\end_inset

.
 After the code transformation the output of 
\family typewriter
ac++
\family default
 can be compiled to executable code with ordinary C++ compilers like GNU 
\family typewriter
g++
\family default
,
 clang++,
 or Microsoft VisualC++.
\end_layout

\begin_layout Standard
More details about the features of the AspectC++ language can be found in the 
\emph on
First Steps
\emph default
 manual,
 the 
\emph on
Quick Reference Sheet
\emph default
,
 and the 
\emph on
Language Reference
\emph default
.
 Everything is available on the AspectC++ homepage 
\begin_inset Flex URL
status collapsed

\begin_layout Plain Layout

http://www.aspectc.org
\end_layout

\end_inset

,
 which is also a source for updates of this manual.
\end_layout

\begin_layout Standard
The compiler's source code is freely available from the project's web site and covered by the GPL.
 For your convenience there are also binary versions of the open source implementation available.
 
\begin_inset Note Note
status open

\begin_layout Plain Layout
Besides the free GPL version,
 commercial licenses for 
\family typewriter
ac++
\family default
,
 the underlying parser and code manipulator library and the 
\family typewriter
ac++
\family default
 integration into the MS Visual Studio IDE as well as commercial support are available from pure-systems GmbH
\begin_inset Foot
status open

\begin_layout Plain Layout
\begin_inset Flex URL
status collapsed

\begin_layout Plain Layout

http://www.pure-systems.com/
\end_layout

\end_inset


\end_layout

\end_inset

.
\end_layout

\end_inset


\end_layout

\begin_layout Standard
This document focuses on how the 
\family typewriter
ac++
\family default
 compiler works and how it is used.
 The following sections are structured as follows:
 Section 
\begin_inset CommandInset ref
LatexCommand ref
reference "sec:install"
nolink "false"

\end_inset

 describes how to get and install the compiler.
 It is followed by Section 
\begin_inset CommandInset ref
LatexCommand ref
reference "sec:Invocation"
nolink "false"

\end_inset

,
 which describes the two transformation modes of 
\family typewriter
ac++
\family default
 and the meaning of the command line arguments.
 Section 
\begin_inset CommandInset ref
LatexCommand ref
reference "sec:Pragmas"
plural "false"
caps "false"
noprefix "false"
nolink "false"

\end_inset

 is dedicated to ac++-specific 
\begin_inset Quotes eld
\end_inset

pragmas
\begin_inset Quotes erd
\end_inset

 that extend the core AspectC++ language.
 Platform-specific notes are given in Section 
\begin_inset CommandInset ref
LatexCommand ref
reference "sec:Platform-Notes"
nolink "false"

\end_inset

.
 It describes the specifics of the ac++ ports and which non-standard features of the back-end C++ compiler are supported.
 Section 
\begin_inset CommandInset ref
LatexCommand ref
reference "sec:Problems"
nolink "false"

\end_inset

 lists some known problems,
 common pitfalls,
 and unimplemented language features.
\end_layout

\begin_layout Section
\begin_inset CommandInset label
LatexCommand label
name "sec:install"

\end_inset

Download and Installation
\end_layout

\begin_layout Standard
Binaries of 
\family typewriter
ac++
\family default
 for various platforms are available for free download from the AspectC++ homepage (see Section 
\begin_inset CommandInset ref
LatexCommand ref
reference "sec:Platform-Notes"
nolink "false"

\end_inset

 for the list and state of the 
\family typewriter
ac++
\family default
 ports).
 The versioning scheme is shown in table 
\begin_inset CommandInset ref
LatexCommand vref
reference "tab:versioning"
nolink "false"

\end_inset

.
\end_layout

\begin_layout Standard
\begin_inset Float table
placement H
alignment document
wide false
sideways false
status open

\begin_layout Plain Layout
\align center
\begin_inset Tabular
<lyxtabular version="3" rows="4" columns="3">
<features tabularvalignment="middle">
<column alignment="center" valignment="top" width="0in">
<column alignment="center" valignment="top">
<column alignment="center" valignment="top">
<row>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout

\series bold
Scheme
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout

\series bold
Example
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout

\series bold
Kind of Release/Meaning
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
<version>.<release>
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
0.7
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
A regular release 0.7.
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
<version>.<release>.<fix-no>
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
0.7.3
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Bug fix release number 3 of 0.7
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
<version>.<release>pre<no>
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
0.8pre1
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Pre-Release number 1 for 0.8
\end_layout

\end_inset
</cell>
</row>
</lyxtabular>

\end_inset


\end_layout

\begin_layout Plain Layout
\begin_inset Caption Standard

\begin_layout Plain Layout
\begin_inset CommandInset label
LatexCommand label
name "tab:versioning"

\end_inset

Versioning scheme
\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Standard
Besides the archive file with the compiler there is a README file and a CHANGELOG file available for each release.
 The README file explains the necessary steps for the installation,
 while the CHANGELOG documents the changes in the corresponding release as well as the history of changes.
\end_layout

\begin_layout Standard
The following subsections explain how the current version of the 
\family typewriter
ac++
\family default
 compiler is unpacked,
 installed,
 and configured.
 This process depends on the development platform.
 Skip to the appropriate part from here.
\end_layout

\begin_layout Subsection
\begin_inset CommandInset label
LatexCommand label
name "sec:unix_install"

\end_inset

Linux and MacOS X
\end_layout

\begin_layout Standard
The Linux and MacOS X installation procedures are very similar,
 because all of them belong to the UNIX system family.
 The 
\family typewriter
ac++
\family default
 compiler and the example code is provided in a 
\family typewriter
gzip
\family default
-ed 
\family typewriter
tar
\family default
 archive (tgz file).
 It can be unpacked with the following command in any directory:
\end_layout

\begin_layout Standard
\begin_inset listings
lstparams "language=bash"
inline false
status open

\begin_layout Plain Layout

tar xzvf <tar-file-name>
\end_layout

\end_inset


\end_layout

\begin_layout Standard
The command creates a directory aspectc++-<version>,
 which contains the 
\family typewriter
ac++
\family default
 binary,
 the 
\family typewriter
ag++
\family default
 front-end,
 the example code,
 and everything else that is needed to run the examples like a Makefile.
 To transform the examples (in the 
\family typewriter
examples
\family default
 directory) simply execute 
\family typewriter
make
\family default
 in the installation directory.
 Each example is then transformed from AspectC++ code into C++ code by weaving aspects and saved in 
\family typewriter
examples/<name>-out
\family default
.
 To run the example,
 enter the created directory,
 call 
\family typewriter
make
\family default
 and start the executable.
\end_layout

\begin_layout Standard
The 
\family typewriter
Makefile
\family default
,
 which is used to compile the examples uses the command 
\family typewriter
ag++
\family default
,
 which is a wrapper for calling 
\family typewriter
ac++
\family default
,
 
\family typewriter
g++
\family default
,
 and for the generation of the parser configuration file,
 which is needed for 
\family typewriter
ac++
\family default
.
 A separate manual for 
\family typewriter
ag++
\family default
 is available from the AspectC++ web site.
\end_layout

\begin_layout Subsection
Windows
\end_layout

\begin_layout Standard
The Windows port of 
\family typewriter
ac++
\family default
 supports the freely available Cygwin/GNU 
\family typewriter
g++
\family default
 and MinGW 
\family typewriter
g++
\family default
 compiler as back-end compilers.
\end_layout

\begin_layout Standard
The installation of 
\family typewriter
ac++
\family default
 in an environment with GNU 
\family typewriter
g++
\family default
 and 
\family typewriter
make
\family default
 is similar to the UNIX-like installation described in Section 
\begin_inset CommandInset ref
LatexCommand ref
reference "sec:unix_install"
nolink "false"

\end_inset

.
 Additionally refer to Section 
\begin_inset CommandInset ref
LatexCommand vref
reference "sec:cygwin_back_end"
nolink "false"

\end_inset

,
 which provides some specific information about path names in the Cygwin environment.
\end_layout

\begin_layout Standard
The following procedure outlines the installation for non-g++ windows command line compilers:
 The 
\family typewriter
ac++
\family default
 compiler and the examples are provided in a ZIP archive.
 Unpack 
\family typewriter
ac++
\family default
 in a directory of your choice,
 for instance into 
\family typewriter
C:
\backslash
AC
\family default
.
 The next step is to create a parser configuration file that describes predefined macros and standard include file paths of your back-end compiler.
 The files 
\family typewriter
pumabc55.cfg
\family default
 and 
\family typewriter
pumavc7.cfg
\family default
 can be taken as examples.
 An automatic generation of the config file as under UNIX systems is not available at the moment in the free 
\family typewriter
ac++
\family default
 version.
\end_layout

\begin_layout Standard
The examples directory contains various examples that show how to write aspects in AspectC++.
 You can use the 
\family typewriter
examples.bat
\family default
 batch file to weave all the examples at once.
 After this step the transformed example files can compiled.
\end_layout

\begin_layout Section

\family sans
\begin_inset CommandInset label
LatexCommand label
name "sec:Invocation"

\end_inset


\family default
Invocation
\end_layout

\begin_layout Subsection
Modes
\end_layout

\begin_layout Standard
The 
\family typewriter
ac++
\family default
 compiler supports two major transformation modes:
\end_layout

\begin_layout Subsubsection
Whole ProgramTransformation (WPT) 
\end_layout

\begin_layout Standard
WPT mode was the first transformation mode of 
\family typewriter
ac++
\family default
.
 However,
 it is not obsolete,
 because it may be useful in many cases.
 In this mode 
\family typewriter
ac++
\family default
 transforms all files in a project directory tree (or set of directories) and saves the result in a different directory tree.
 For each translation unit and header file a new file is generated in the target tree with the same name.
 If further transformations of the source code have to be done,
 either with 
\family typewriter
ac++
\family default
 or other tools,
 this is the mode to choose.
 Even comments and whitespace remain untouched.
\end_layout

\begin_layout Standard
The compiler performs a simple dependency check in WPT mode.
 A translation unit is recompiled if either the translation unit itself or any header file of the project has been changed.
 This is not very precise but makes sure that after changing an aspect header file all translation units are recompiled.
\end_layout

\begin_layout Subsubsection
Single Translation Unit (STU)
\end_layout

\begin_layout Standard
In the STU mode 
\family typewriter
ac++
\family default
 must be called once for each translation unit like a normal C++ compiler.
 This makes it easier to integrate 
\family typewriter
ac++
\family default
 into Makefiles or IDEs.
 As 
\family typewriter
ac++
\family default
 can't save manipulated header files in this mode,
 because the unchanged header files are needed for the next translation units,
 all #include directives in the translation unit that refer to header files of the project directory tree are expanded and,
 thus,
 saved together with the manipulated translation unit.
 The resulting files can be fed directly into a C++ compiler.
 They do not depend on any other files of the project anymore.
\end_layout

\begin_layout Standard
In the STU mode the user is responsible for checking the dependencies of changed files and for calling the right 
\family typewriter
ac++
\family default
 to transform all translation units that depend on a changed file.
 The general dependency rule is that a translation unit depends on every header file that is directly or indirectly included and every aspect header that might affect the translation unit (normally all!) and the files they depend on.
 If you are using 
\family typewriter
g++
\family default
 and 
\family typewriter
make
\family default
,
 checking of this rule can be automized:
\end_layout

\begin_layout Standard
\begin_inset listings
lstparams "language=bash"
inline false
status open

\begin_layout Plain Layout

g++ -E -I<some-path> -MM <trans-unit> -include "*.ah"
\end_layout

\end_inset


\end_layout

\begin_layout Standard
This call of the 
\family typewriter
g++
\family default
 preprocessor prints a makefile dependency rule,
 which is suitable to determine when 
\family typewriter
ac++
\family default
 must be run to rebuild a tranlsation unit.
\end_layout

\begin_layout Subsection
\begin_inset CommandInset label
LatexCommand label
name "sec:library"

\end_inset

Weaving in Library Code
\end_layout

\begin_layout Standard
A C++ library consists of header files that have to be included by the client code and an archive file that contains the object code.
 If the library is implemented in AspectC++ and the client code should not be compiled with 
\family typewriter
ac++
\family default
 it is necessary to generate manipulated header files.
 In the WPT mode this is done anyway.
 In the STU a directory tree with all manipulated headers can be generated with the 
\family typewriter
-i
\family default
 option (see 
\begin_inset CommandInset ref
LatexCommand vref
reference "sec:option_i"
nolink "false"

\end_inset

).
\end_layout

\begin_layout Subsection
The Project Repository
\end_layout

\begin_layout Standard
The 
\family typewriter
ac++
\family default
 weaver internally creates a translation unit model,
 which contains a description of all name and code join points as well as the weaving plan,
 while it processes a C++ input file.
 By using the command line option 
\family typewriter
-r
\family default
 (or 
\family typewriter
--repository
\family default
) it is possible to save this model in a file called the 
\begin_inset Quotes eld
\end_inset

project repository
\begin_inset Quotes erd
\end_inset

.
 If the project repository already exists,
 ac++ will 
\emph on
merge
\emph default
 its translation unit model into the existing project repository.
 Eventually,
 after translation of all C++ input files of the project,
 the repository will contain a description of 
\emph on
all
\emph default
 potential and affected join points in the project.
 When an input file is modified and re-translated,
 
\family typewriter
ac++
\family default
 will update the repository accordingly.
\end_layout

\begin_layout Standard
The project model can be used for various purposes,
 e.g.
 as input for join point visualization tools.
 It can also be used for checking pointcut expressions or even their interactive development.
 This is supported by the 
\family typewriter
-x
\family default
 (or 
\family typewriter
--expr
\family default
) command line option,
 which can be used to evaluate a given pointcut expression by matching it against the join points in the the repository.
 The internal structure of the project repository might be subject to future changes.
\end_layout

\begin_layout Subsection
Options
\end_layout

\begin_layout Standard
Table 
\begin_inset CommandInset ref
LatexCommand vref
reference "tab:options"
nolink "false"

\end_inset

 summarizes the platform-independent options supported by 
\family typewriter
ac++
\family default
.
 Platform specific options will be explained in Section 
\begin_inset CommandInset ref
LatexCommand ref
reference "sec:Platform-Notes"
nolink "false"

\end_inset

.
 All options can either be passed as command line arguments or by the configuration file
\begin_inset Foot
status open

\begin_layout Plain Layout
In the current ac++ version some of these options are not allowed in the config file,
 namely all between 
\family typewriter
-v
\family default
 and 
\family typewriter
--no_problem...
\family default
.
 
\end_layout

\end_inset

,
 which is referenced by the environment variable PUMA_CONFIG (see Section 
\begin_inset CommandInset ref
LatexCommand ref
reference "sec:install"
nolink "false"

\end_inset

).
 '–' in any of the columns WPT or STU means that this option has no meaning in the corresponding translation mode.
\end_layout

\begin_layout Standard
The upper part of the table lists 
\family typewriter
ac++
\family default
-specific options,
 while the options in the lower part are widely-known from other compilers like 
\family typewriter
g++
\family default
.
\end_layout

\begin_layout Standard
\begin_inset Float table
placement document
alignment document
wide false
sideways false
status open

\begin_layout Plain Layout
\align center
\begin_inset Tabular
<lyxtabular version="3" rows="29" columns="4">
<features tabularvalignment="middle">
<column alignment="center" valignment="top">
<column alignment="center" valignment="top">
<column alignment="center" valignment="top">
<column alignment="block" valignment="top" width="6.5cm">
<row>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout

\series bold
Option
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout

\series bold
WPT
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout

\series bold
STU
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout

\series bold
Description
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout

\family typewriter
\size small
-p|--path
\begin_inset space ~
\end_inset

<arg>
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
X
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
X
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Defines a project directory
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout

\family typewriter
\size small
-e|--extension <arg>
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
X
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
–
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Filename extension of translation units
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout

\family typewriter
\size small
-v|--verbose <arg>
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
X
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
X
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Level of verbosity (
\family typewriter
0
\family default
-
\family typewriter
9
\family default
)
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout

\family typewriter
\size small
-c|--compile <arg>
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
–
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
X
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Name of the input file
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout

\family typewriter
\size small
-o|--output <arg>
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
–
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
X
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Name of the output file
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout

\family typewriter
\size small
-g|--generate
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
–
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
X
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Generate link-once code
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout

\family typewriter
\size small
-i|--include_files
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
–
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
X
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Generate manipulated header files
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout

\family typewriter
\size small
-a|--aspect_header <arg>
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
X
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
X
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Name of aspect header file or 
\family typewriter
\color none
0
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout

\family typewriter
\size small
-r|--repository <arg>
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
X
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
X
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Name of the project repository
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout

\family typewriter
\size small
-x|--expr <arg>
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
–
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
–
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Match a pointcut expression (arg) agaist the project repository
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout

\family typewriter
–-gen_deps <arg>
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
X
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
X
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Generate aspect dependency file based on pragmas in aspect headers
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout

\family typewriter
\size small
--config <arg>
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
X
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
X
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Parser configuration file
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout

\family typewriter
\size small
-k|--keywords
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
X
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
X
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Allow AspectC++ keywords in normal project files
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout

\family typewriter
\size small
--introduction_depth <arg>
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout

\family typewriter
X
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout

\family typewriter
X
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Set the maximum depth for nested introductions
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout

\family typewriter
\size small
--no_line
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
X
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
X
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Disable generation of 
\family typewriter
#line
\family default
 directives
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout

\family typewriter
\size small
--gen_size_type <arg>
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
X
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
X
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
use a specific string as size_t
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout

\family typewriter
\size small
--warn...
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
X
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
X
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
enable a weaver warning that is suppressed by default
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout

\family typewriter
\size small
--no_warn...
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
X
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
X
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
suppress a specific weaver warning
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout

\family typewriter
\size small
--problem...
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
X
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
X
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
enable back-end compiler problem workaround (see 
\begin_inset CommandInset ref
LatexCommand ref
reference "sec:back-end"
nolink "false"

\end_inset

)
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout

\family typewriter
\size small
--no_problem...
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
X
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
X
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
disable back-end compiler problem workaround
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout

\family typewriter
\size small
--builtin_operators
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
X
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
X
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Support advice on built-in operator calls
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout

\family typewriter
\size small
--data_joinpoints
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
X
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
X
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Support data-based join points,
 e.g.
 get(),
 set(),
 ...
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout

\family typewriter
\size small
--attributes
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
X
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
X
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Support C++11-attribute-based join points
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout

\family typewriter
\size small
--no_attributes
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
X
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
X
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Disable support user-defined attributes
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout

\family typewriter
\size small
-I <arg>
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
X
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
X
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Include file search path
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout

\family typewriter
\size small
-D <name>[=<value>]
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
X
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
X
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Macro definitions
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout

\family typewriter
\size small
-U <name>
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
X
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
X
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Undefine a macro
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout

\family typewriter
\size small
--include <arg>
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
X
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
X
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Forced include
\end_layout

\end_inset
</cell>
</row>
</lyxtabular>

\end_inset


\end_layout

\begin_layout Plain Layout
\begin_inset Caption Standard

\begin_layout Plain Layout
\begin_inset CommandInset label
LatexCommand label
name "tab:options"

\end_inset


\family typewriter
ac++
\family default
 Compiler Option Summary
\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Subsubsection

\family sans
\begin_inset CommandInset label
LatexCommand label
name "sec:-p| --path"

\end_inset


\family typewriter
-p|--path
\begin_inset space ~
\end_inset

<arg>
\end_layout

\begin_layout Standard
This option defines the name of a project directory tree 
\family typewriter
<arg>
\family default
.
 The option can be used more than once if several directories belong to the project.
 At least one 
\family typewriter
-p
\family default
 options is always needed when 
\family typewriter
ac++
\family default
 has to transform code,
 even in STU mode.
\end_layout

\begin_layout Subsubsection

\family typewriter
-d|--dest <arg>
\end_layout

\begin_layout Standard
With 
\family typewriter
-d
\family default
 a target directory for saving is selected.
 It corresponds to the last 
\family typewriter
-p
\family default
 option.
 For example,
 if two directories belong to a project they would be described in STU mode with
\end_layout

\begin_layout Standard
\begin_inset listings
lstparams "language=bash"
inline false
status open

\begin_layout Plain Layout

-p dir1 -p dir2
\end_layout

\end_inset


\end_layout

\begin_layout Standard
and in WPT with two source/target pairs:
\end_layout

\begin_layout Standard
\begin_inset listings
lstparams "language=bash"
inline false
status open

\begin_layout Plain Layout

-p source1 -d target1 -p source2 -d target2
\end_layout

\end_inset


\end_layout

\begin_layout Standard
In STU mode 
\family typewriter
-d
\family default
 makes only sense in combination with 
\family typewriter
-i
\family default
 to generate header files for a library (see 
\begin_inset CommandInset ref
LatexCommand vref
reference "sec:option_i"
nolink "false"

\end_inset

).
\end_layout

\begin_layout Subsubsection

\family typewriter
-e|--extension <arg>
\end_layout

\begin_layout Standard
In WPT mode 
\family typewriter
ac++
\family default
 searches in all project directories for translation units to transform.
 Translation units are identified by their filename extension.
 The default is 
\begin_inset Quotes eld
\end_inset

cc
\begin_inset Quotes erd
\end_inset

,
 which means that all files ending with 
\begin_inset Quotes eld
\end_inset

.cc
\begin_inset Quotes erd
\end_inset

 are handled.
 By using the option 
\family typewriter
-e cpp
\family default
 or 
\family typewriter
-e cxx
\family default
 you can select other frequently used filename extensions.
 The option can be used more than once,
 but only the last one is effective.
\end_layout

\begin_layout Standard
In WPT mode 
\family typewriter
ac++
\family default
 generates a file called 
\family typewriter
ac_gen.<extension>
\family default
.
 This extension is also taken from the 
\family typewriter
-e
\family default
 option,
 if one is provided.
\end_layout

\begin_layout Subsubsection

\family typewriter
-v|--verbose [<arg>]
\end_layout

\begin_layout Standard
The compiler can print message on the standard output device,
 which describe what it is currently doing.
 These message can be printed with different levels of details.
 You can select this level with the parameter 
\family typewriter
<arg>
\family default
.
 The range is from 
\family typewriter
0
\family default
,
 which means no output,
 to 
\family typewriter
9
\family default
,
 which means all details.
 The option 
\family typewriter
-v0
\family default
 is the same as having no 
\family typewriter
-v
\family default
 option at all.
 
\family typewriter
-v
\family default
 without 
\family typewriter
<arg>
\family default
 is the same as 
\family typewriter
-v3
\family default
.
\end_layout

\begin_layout Standard
The 
\family typewriter
-v
\family default
 option can be used more than once but only the last one is effective.
\end_layout

\begin_layout Subsubsection

\family typewriter
-c|--compile <arg>
\end_layout

\begin_layout Standard
The 
\family typewriter
-c
\family default
 option is used to select an input file for 
\family typewriter
ac++
\family default
 in the STU mode.
 Using it more than once is possible,
 but only one is effective.
 There are no restrictions on the filename extension.
 
\family typewriter
ac++
\family default
 expects that the file contains AspectC++ source code.
\end_layout

\begin_layout Subsubsection

\family typewriter
-o|--output <arg>
\end_layout

\begin_layout Standard
With the -o option one can select the name of the output file,
 i.e.
 the name of the target of the code transformation,
 in STU mode.
 If this option is not used,
 the default output filename is 
\family typewriter
ac.out
\family default
.
 Note that the output filename is 
\emph on
not
\emph default
 derived from the input file name as it is done by other compilers.
\end_layout

\begin_layout Subsubsection

\family typewriter
\begin_inset CommandInset label
LatexCommand label
name "sec:option_i"

\end_inset

-i|--include_files
\end_layout

\begin_layout Standard
The 
\family typewriter
-i
\family default
 option has to be used if the source code of the project should be compiled into a library and 
\family typewriter
ac++
\family default
 should run in STU mode (see 
\begin_inset CommandInset ref
LatexCommand vref
reference "sec:library"
nolink "false"

\end_inset

).
 When a translation unit is transformed by using 
\family typewriter
-c
\family default
 and 
\family typewriter
-o
\family default
 in STU mode no manipulated header files are generated.
 All include files are expanded within the generated source code.
 This is fully sufficient if the translation units will then be compiled and linked directly.
 However,
 if a library should be provided the client needs a library file (an archive) 
\emph on
and
\emph default
 manipulated header files.
 These can be generated with 
\family typewriter
-i
\family default
.
 The generation results in a directory tree with the same structure as the input directory tree specified by 
\family typewriter
-p
\family default
 exhibits.
 Use the 
\family typewriter
-d
\family default
 option to select the target directory name(s).
\end_layout

\begin_layout Standard
Note that at the moment only and all files with the extension 
\family typewriter
.h
\family default
 are considered to be include files.
 This is rather inflexible and will be improved in future releases.
\end_layout

\begin_layout Subsubsection

\family typewriter
-a|--aspect_header <arg>
\end_layout

\begin_layout Standard
By default 
\family typewriter
ac++
\family default
 searches all files with the filename extension 
\family typewriter
.ah
\family default
 in the project directory tree(s) and allows all aspects defined in these files to affect the current translation unit.
 If you are looking for a simple mechanism to deactivate aspects at compile-time,
 or if 
\family typewriter
.ah
\family default
 does not conform to your local conventions,
 or if not all aspects should affect all translation units (be careful!
 See 
\begin_inset CommandInset ref
LatexCommand vref
reference "sec:pitfalls"
nolink "false"

\end_inset

),
 the 
\family typewriter
-a
\family default
 option might help.
\end_layout

\begin_layout Standard
The option may be used more than once and each of them selects one aspect header that has to be considered for the current translation unit in STU mode or all translation units in WPT mode.
 If no aspect header should be considered use 
\family typewriter
-a0
\family default
.
\end_layout

\begin_layout Subsubsection

\family typewriter
-r|--repository <arg>
\end_layout

\begin_layout Standard
The 
\begin_inset Quotes eld
\end_inset

project repository
\begin_inset Quotes erd
\end_inset

 is an XML-based description of global information about an AspectC++ development project that is compiled with 
\family typewriter
ac++
\family default
.
 It fulfills two purposes:
\end_layout

\begin_layout Enumerate
It is a vehicle to transport information from one compiler run to another
\end_layout

\begin_layout Enumerate
It might be used by integrated development environments to visualize the join points where aspects affect the component code.
\begin_inset Foot
status open

\begin_layout Plain Layout
In fact,
 the AspectC++ Development Tools for Eclipse (ACDT) already use the repository to visualize matched join points.
 See the ACDT homepage 
\begin_inset Flex URL
status collapsed

\begin_layout Plain Layout

http://acdt.aspectc.org/
\end_layout

\end_inset

 for information on the ACDT project.
\end_layout

\end_inset


\end_layout

\begin_layout Standard
The 
\family typewriter
-r
\family default
 option is used to define the name of the project repository file.
 However,
 this is an experimental feature.
 The file format might be subject to future changes.
 The uniqueness of join point IDs is only guaranteed if the project is compiled with a project repository.
 If a file with the given name does not exist,
 
\family typewriter
ac++
\family default
 will create a new repository file.
 If the file exists,
 but is empty or does not contain valid data,
 
\family typewriter
ac++
\family default
 terminates with an error message.
 A warning messages will be printed if the version of the weaver,
 which created the project repository,
 differs from the current 
\family typewriter
ac++
\family default
 version.
\end_layout

\begin_layout Subsubsection

\family typewriter
-x|--expr <arg>
\end_layout

\begin_layout Standard
This option is used to match a pointcut expression,
 given as argument <arg>,
 against a project repository file.
 The project repository filename has to be provided with the 
\family typewriter
-r
\family default
 option.
 For example the following command prints all nested class known in the 
\begin_inset Quotes eld
\end_inset

PragmaOnceObserver
\begin_inset Quotes erd
\end_inset

 test program in the AspectC++ development tree.
\end_layout

\begin_layout Standard
\begin_inset listings
lstparams "language=bash,basicstyle={\small}"
inline false
status open

\begin_layout Plain Layout

prompt> ac++ -x '"%::%"' -r PragmaOnceObserver/repo.acp
\end_layout

\begin_layout Plain Layout

ObserverPattern.ah:12:
 Class "ObserverPattern::Subject"
\end_layout

\begin_layout Plain Layout

ObserverPattern.ah:13:
 Class "ObserverPattern::Observer"
\end_layout

\end_inset


\end_layout

\begin_layout Standard
This example illustrates the mechanism with a more complicated pointcut expression:
\end_layout

\begin_layout Standard
\begin_inset listings
lstparams "language=bash,basicstyle={\footnotesize}"
inline false
status open

\begin_layout Plain Layout

prompt> ac++ -x 'call("%") && within("% main()")' -r ...
\end_layout

\begin_layout Plain Layout

main.cc:29:
 Call "void ObserverPattern::addObserver( ...
\end_layout

\begin_layout Plain Layout

main.cc:32:
 Call "void ObserverPattern::addObserver( ...
\end_layout

\begin_layout Plain Layout

main.cc:34:
 Call "void ClockTimer::Tick()"
\end_layout

\begin_layout Plain Layout

main.cc:37:
 Call "void ClockTimer::Tick()"
\end_layout

\end_inset


\end_layout

\begin_layout Standard
Note that pointcut expression contain quotes (
\family typewriter

\begin_inset Quotes eld
\end_inset


\family default
).
 Make sure that quotes are not removed by the command shell.
 On Linux systems it is a convenient solution to enclose the pointcut expression in single quotes,
 e.g.
 
\family typewriter
'
\begin_inset Quotes erd
\end_inset

%
\begin_inset Quotes erd
\end_inset

'
\family default
.
\end_layout

\begin_layout Subsubsection

\family typewriter
\begin_inset CommandInset label
LatexCommand label
name "subsec:option_gen_deps"

\end_inset

–-gen_deps <arg>
\end_layout

\begin_layout Standard
With this command line option ac++ analyzes all 
\begin_inset Quotes eld
\end_inset


\family typewriter
#pragma acxx affect
\family default
 <filename-pattern>
\begin_inset Quotes erd
\end_inset

 in aspect headers and generates an aspect dependency file named <arg> suitable for use with 
\family typewriter
ag++
\family default
.
 This can speed up incremental build times dramatically.
 For more information refer to Section 
\begin_inset CommandInset ref
LatexCommand ref
reference "sec:Pragmas"
plural "false"
caps "false"
noprefix "false"
nolink "false"

\end_inset

 on the ac++ pragmas as well as the 
\emph on
Ag++ Manual
\emph default
.
\end_layout

\begin_layout Subsubsection

\family typewriter
--config <arg>
\end_layout

\begin_layout Standard
Besides setting the environment variable 
\family typewriter
PUMA_CONFIG
\family default
 this options can be used to set the path to the parser configuration file.
\end_layout

\begin_layout Subsubsection

\family typewriter
-k|--keywords
\end_layout

\begin_layout Standard
By default the AspectC++ keywords 
\family typewriter
aspect
\family default
,
 
\family typewriter
pointcut
\family default
,
 
\family typewriter
advice
\family default
,
 
\family typewriter
slice
\family default
 and 
\family typewriter
attribute
\family default
 are only treated as keywords in aspect header files.
 If they are used in normal project files,
 
\family typewriter
ac++
\family default
 interprets them as normal identifiers.
 By this design decision aspects can be woven into legacy code even if the code uses the AspectC++ keywords as normal identifiers.
\end_layout

\begin_layout Standard
If the AspectC++ keywords should be interpreted as keywords in normal project files as well,
 the command line option 
\family typewriter
-k
\family default
 or 
\family typewriter
--keywords
\family default
 has to be used.
\end_layout

\begin_layout Standard
In files that do 
\emph on
not
\emph default
 belong to the project,
 e.g.
 standard library header files,
 the AspectC++ keywords are always regarded as normal identifiers,
 even if 
\family typewriter
-k
\family default
 or 
\family typewriter
--keywords
\family default
 is used.
\end_layout

\begin_layout Standard
If any of the AspectC++ keywords is generated by a macro,
 the classification as keyword or identifier is based on the file in which the macro expansion takes place.
 It does not depend on the location of the macro definition.
\end_layout

\begin_layout Subsubsection

\family typewriter
--introduction_depth <arg>
\end_layout

\begin_layout Standard
AspectC++ introductions may affect introduced code.
 This is called a 
\begin_inset Quotes eld
\end_inset

nested introduction
\begin_inset Quotes erd
\end_inset

.
 In order to avoid problems with infinitely nested introductions,
 
\family typewriter
ac++
\family default
 checks the 
\begin_inset Quotes eld
\end_inset

depth
\begin_inset Quotes erd
\end_inset

 of a nested introduction and does not allow a depth that exceeds the given maximum 
\family typewriter
<arg>
\family default
.
 The default value for 
\family typewriter
<arg>
\family default
 is 10.
 
\end_layout

\begin_layout Subsubsection

\family typewriter
--no_line
\end_layout

\begin_layout Standard
When 
\family typewriter
ac++
\family default
 manipulates files,
 e.g.
 by inserting generated code,
 it also inserts 
\family typewriter
#line
\family default
 directives.
 Inserting these directives can be disabled with the 
\family typewriter
--no_line
\family default
 option.
 Normally,
 
\family typewriter
#line
\family default
 directives are only generated by C preprocessors.
 The directives are important for back-end compiler error messages and source code debuggers.
 Without the 
\family typewriter
#line
\family default
 generation these numbers correspond to the lines in the generated code,
 while they correspond to the source code written by the programmer otherwise.
\end_layout

\begin_layout Subsubsection

\family typewriter
--gen_size_type <arg>
\end_layout

\begin_layout Standard

\family typewriter
ac++
\family default
 generates a 
\family typewriter
new
\family default
 operator,
 which has 
\family typewriter
size_t
\family default
 in its argument type list.
 As the generated code shall not include the respective header file (to avoid portability problems),
 the weaver normally generates the name of the right type.
 However,
 in case of cross-compilation the type on the target platform might differ.
 Then it is possible to provide a string with this option,
 which is directly used in the constructor's argument list.
\end_layout

\begin_layout Subsubsection

\family typewriter
--problem...
\end_layout

\begin_layout Standard
An option like this is used to enable a back-end compiler-specific code generation workaround.
 This is sometimes needed,
 because the C++ compilers differ in their degree of standard conformance.
 For details about the workarounds needed for each back-end refer to Section 
\begin_inset CommandInset ref
LatexCommand ref
reference "sec:back-end"
nolink "false"

\end_inset

.
\end_layout

\begin_layout Subsubsection

\family typewriter
--no_problem...
\end_layout

\begin_layout Standard
This option can be used to disable a back-end compiler-specific code generation workaround which is enabled by default.
\end_layout

\begin_layout Subsubsection

\family typewriter
--warn_...
\end_layout

\begin_layout Standard
With this option the weaver is instructed to print specific warnings that are otherwise suppressed.
 Table 
\begin_inset CommandInset ref
LatexCommand ref
reference "tab:warnings"
nolink "false"

\end_inset

 lists the names of warnings currently supported by the weaver.
\end_layout

\begin_layout Subsubsection

\family typewriter
--no_warn_...
\end_layout

\begin_layout Standard
The warnings listed in table 
\begin_inset CommandInset ref
LatexCommand ref
reference "tab:warnings"
nolink "false"

\end_inset

 can be suppressed with 
\family typewriter
--no_warn_
\family default
<
\emph on
Name
\emph default
>.
\end_layout

\begin_layout Standard
\begin_inset Float table
placement document
alignment document
wide false
sideways false
status open

\begin_layout Plain Layout
\align center
\begin_inset Tabular
<lyxtabular version="3" rows="3" columns="2">
<features tabularvalignment="middle">
<column alignment="left" valignment="top">
<column alignment="left" valignment="top">
<row>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout

\series bold
Warning Name
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout

\series bold
Condition
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout

\family typewriter
deprecated
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
a deprecated syntax is being used
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout

\family typewriter
macro
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
macro-generated code would have to be transformed
\end_layout

\end_inset
</cell>
</row>
</lyxtabular>

\end_inset


\end_layout

\begin_layout Plain Layout
\begin_inset Caption Standard

\begin_layout Plain Layout

\family typewriter
\begin_inset CommandInset label
LatexCommand label
name "tab:warnings"

\end_inset

ac++
\family default
 Warnings
\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Subsubsection

\family typewriter
--builtin_operators
\end_layout

\begin_layout Standard
This option is needed if you want to use the pointcut function builtin().
 For more information on this feature consult the language reference manual.
\end_layout

\begin_layout Subsubsection

\family typewriter
--data_joinpoints
\end_layout

\begin_layout Standard
This option is needed if you want to use the pointcut functions get(),
 set(),
 and ref().
 For more information on this feature consult the language reference manual.
\end_layout

\begin_layout Subsubsection

\family typewriter
--attributes/--no_attributes
\end_layout

\begin_layout Standard
This option is needed if you want to use attributes in C++11-Style (e.g.
 [[noreturn]]).
 It is enabled by default and can be disabled with
\family typewriter
 --no_attributes
\family default
.
 For more information on this feature consult the language reference.
\end_layout

\begin_layout Subsubsection

\family typewriter
-I <arg>
\end_layout

\begin_layout Standard
The option 
\family typewriter
-I
\family default
 adds the directory 
\family typewriter
<arg>
\family default
 to the list of directories to be searched for header files.
 It can be used more than once.
 The compiler 
\family typewriter
ac++
\family default
 needs to know all directories,
 where header files for the current translation unit might be located.
\end_layout

\begin_layout Standard
In case of system headers there are often a lot of these directories.
 To make the setup of 
\family typewriter
ac++
\family default
 more convenient we provide the 
\family typewriter
ag++ --gen_config
\family default
 command.
 The command calls the 
\family typewriter
g++
\family default
 compiler to get all these paths.
 Users of non-supported back-end compilers have to find out this list on their own.
\end_layout

\begin_layout Subsubsection

\family typewriter
-D <name>[=<value>]
\end_layout

\begin_layout Standard
With 
\family typewriter
-D
\family default
 a preprocessor macro 
\family typewriter
<name>
\family default
 will be defined.
 Without the optional value assignment the macro will get the value 
\family typewriter
1
\family default
.
 The option can be used more than once.
\end_layout

\begin_layout Standard
In most cases your source code expects some standard macros to be defined like 
\family typewriter
win32
\family default
,
 
\family typewriter
linux
\family default
,
 or 
\family typewriter
i386
\family default
.
 And even if your code doesn't use them directly,
 they are often required to be set correctly by system header files.
 Thus,
 for the 
\family typewriter
ac++
\family default
 parser a correct set of these macros has to be defined.
 For 
\family typewriter
g++
\family default
 users we provide a command called 
\family typewriter
ag++
\family default
 that calls the compiler to get the list of these macros.
 Users of non-supported back-end compilers have to find out this list on their own.
\end_layout

\begin_layout Subsubsection

\family typewriter
-U <name>
\end_layout

\begin_layout Standard
This option can be used to undefine a previously defined macro.
 
\end_layout

\begin_layout Subsubsection

\family typewriter
\begin_inset CommandInset label
LatexCommand label
name "sec:option_include"

\end_inset

-include <arg>
\end_layout

\begin_layout Standard
The 
\family typewriter
-include
\family default
 option can be used to include a file 
\family typewriter
<arg>
\family default
 into the compiled translation unit(s) even though there is no explicit 
\family typewriter
#include
\family default
 directive given in the source code.
 If multiple 
\family typewriter
-include
\family default
 options are given on the command line,
 the files are included in the same order (from left to right).
 If you use the option in STU mode make sure that the back-end compiler is not forced to include the same files again (read details in 
\begin_inset CommandInset ref
LatexCommand vref
reference "sec:dup-forced-includes"
nolink "false"

\end_inset

).
\end_layout

\begin_layout Subsection
Examples
\end_layout

\begin_layout Itemize

\family typewriter
ac++
\family default
 
\begin_inset Newline newline
\end_inset

Displays all options with a short description.
\end_layout

\begin_layout Itemize

\family typewriter
ac++ -I examples/Trace -p examples/Trace -d examples/Trace-out
\family default
 
\begin_inset Newline newline
\end_inset

Transforms the complete project from directory 
\begin_inset Quotes eld
\end_inset

examples/Trace
\begin_inset Quotes erd
\end_inset

 into the directory 
\begin_inset Quotes eld
\end_inset

examples/Trace-out
\begin_inset Quotes erd
\end_inset

.
 This is the whole program transformation (WPT) mode,
 which also performs a simple dependency check.
\end_layout

\begin_layout Standard
The following examples describe the compiler like interface (STU Mode).
 All dependency handling has to be done by the user.
\end_layout

\begin_layout Itemize

\family typewriter
ac++ -c main.cc -p.

\family default
 
\begin_inset Newline newline
\end_inset

Transforms only the translation unit 
\family typewriter
main.cc
\family default
.
 The default name for the output file is 
\family typewriter
ac.out
\family default
.
\end_layout

\begin_layout Itemize

\family typewriter
ac++ -c main.cc -o main.acc -p.
\family default

\begin_inset Newline newline
\end_inset

Transforms the file 
\family typewriter
main.cc
\family default
 into the new file 
\family typewriter
main.acc
\family default
.
\end_layout

\begin_layout Itemize

\family typewriter
ac++ -c main.cc -o main.acc -p.
 -a trace.ah
\family default
 
\begin_inset Newline newline
\end_inset

Transforms the file 
\family typewriter
main
\family default
.
\family typewriter
cc
\family default
 into the new file 
\family typewriter
main.acc
\family default
 with the aspect located in 
\family typewriter
trace.ah
\family default
.
\end_layout

\begin_layout Itemize

\family typewriter
ac++ -i -v9 -p.
 -d includes
\family default

\begin_inset Newline newline
\end_inset

Creates the manipulated project header files and stores them into the directory 
\family typewriter
includes
\family default
.
 ATTENTION:
 This works only once,
 because the 
\family typewriter
includes
\family default
 directory is located inside the project directory tree and the aspect header files exists twice then.
\end_layout

\begin_layout Section
\begin_inset CommandInset label
LatexCommand label
name "sec:Pragmas"

\end_inset

Pragmas
\end_layout

\begin_layout Standard
Pragmas are a means for programmers to give the compiler additional information that cannot be expressed in the core AspectC++ language.
\end_layout

\begin_layout Subsection
\begin_inset CommandInset label
LatexCommand label
name "subsec:Specifying-Aspect-Dependencies"

\end_inset

Specifying Aspect Dependencies
\end_layout

\begin_layout Standard
Aspects that are defined in aspect header files can affect various join points throughout the whole development project.
 This is a powerful feature,
 but has two negative consequences:
\end_layout

\begin_layout Enumerate
Changes in aspect headers could affect any translation unit and,
 thus,
 by default,
 trigger a time-consuming full rebuild.
\end_layout

\begin_layout Enumerate
It is not unlikely to accidentally weave aspect code at join points in files that shouldn't be affected.
\end_layout

\begin_layout Standard
To mitigate both problems 
\family typewriter
ac++
\family default
 provides a pragma that can be used to declare the set of files that are 
\emph on
intended
\emph default
 to be affected by the concrete aspects defined within the aspect header in which the pragma is located.
 Here is an example:
\end_layout

\begin_layout Standard
\begin_inset Flex Color Box
status open

\begin_layout Plain Layout
\begin_inset listings
lstparams "language={[Aspect]{C++}}"
inline false
status open

\begin_layout Plain Layout

#ifndef TRACE_FOO_CALLS_AH
\end_layout

\begin_layout Plain Layout

#define TRACE_FOO_CALLS_AH
\end_layout

\begin_layout Plain Layout

\end_layout

\begin_layout Plain Layout

#pragma acxx affect 
\begin_inset Quotes eld
\end_inset

classA.*
\begin_inset Quotes erd
\end_inset


\end_layout

\begin_layout Plain Layout

#pragma acxx affect 
\begin_inset Quotes eld
\end_inset

classB.*
\begin_inset Quotes erd
\end_inset


\end_layout

\begin_layout Plain Layout

aspect TraceFooCalls {
\end_layout

\begin_layout Plain Layout

  advice call(
\begin_inset Quotes eld
\end_inset

% foo()
\begin_inset Quotes erd
\end_inset

) :
 before() {...}
\end_layout

\begin_layout Plain Layout

};
\end_layout

\begin_layout Plain Layout

\end_layout

\begin_layout Plain Layout

#endif // TRACE_FOO_CALLS_AH
\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Standard
The two pragmas state that only files that match the filename pattern 
\family typewriter

\begin_inset Quotes qrd
\end_inset

classA.*
\begin_inset Quotes qrd
\end_inset


\family default
 
\emph on
or
\emph default
 
\family typewriter

\begin_inset Quotes qrd
\end_inset

classB.*
\begin_inset Quotes qrd
\end_inset


\family default
 should be affected by the aspect 
\family typewriter
TraceFooCalls
\family default
.
 If 
\family typewriter
foo()
\family default
 is called in any other file an error message is printed and the compilation stops.
 As 
\family typewriter
ac++
\family default
 enforces this,
 you can also make use of the pragma for handling aspect dependencies more efficiently.
 Using the command line option 
\family typewriter
–gen_deps
\family default
 (see Section 
\begin_inset CommandInset ref
LatexCommand ref
reference "subsec:option_gen_deps"
plural "false"
caps "false"
noprefix "false"
nolink "false"

\end_inset

) an aspect dependency file can be generated and passed to ag++.
 The exact format of filename patterns is described in the 
\emph on
Ag++ Manual
\emph default
.
\end_layout

\begin_layout Subsection
Filtering Join Points Based on Filenames
\end_layout

\begin_layout Standard
The C++ language elements for expression the program structure,
 such as classes and namespaces,
 are independent of the file structure of the project.
 Therefore,
 the AspectC++ core language also doesn't support the file concept when expression crosscutting concerns.
 However,
 in some situations,
 for example when dealing with C-style projects,
 the file structure might be the only practical way for distinguishing join points.
 In such case the following pragma might be useful:
\end_layout

\begin_layout Standard
\begin_inset Flex Color Box
status open

\begin_layout Plain Layout
\begin_inset listings
lstparams "language={[Aspect]{C++}}"
inline false
status open

\begin_layout Plain Layout

#pragma acxx filter 
\begin_inset Quotes eld
\end_inset

main.cc
\begin_inset Quotes erd
\end_inset


\end_layout

\begin_layout Plain Layout

advice call(
\begin_inset Quotes eld
\end_inset

% printf(...)
\begin_inset Quotes erd
\end_inset

) :
 before() {...}
\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Standard
The 
\family typewriter
#pragma acxx filter
\family default
 in the first line makes sure that the advice in the second line will only affect join points that are lexically located in 
\family typewriter

\begin_inset Quotes qld
\end_inset

main.cc
\begin_inset Quotes qrd
\end_inset


\family default
 even if many calls to 
\family typewriter
printf()
\family default
 are scattered over the whole code base.
 Instead of 
\family typewriter

\begin_inset Quotes qrd
\end_inset

main.cc
\begin_inset Quotes qrd
\end_inset


\family default
 a filename pattern can be specified.
 The pattern syntax is described in the 
\emph on
Ag++ manual
\emph default
.
 If multiple 
\family typewriter
#pragma acxx filter
\family default
 are used in front of advice,
 they all specify valid join point locations.
 Each filter pragma will only affect the next advice in the source code and is 
\begin_inset Quotes eld
\end_inset

forgotten
\begin_inset Quotes erd
\end_inset

 afterwards.
\end_layout

\begin_layout Standard
Filtering join points can be used to avoid error messages triggered by #pragma acxx affect (see Section 
\begin_inset CommandInset ref
LatexCommand ref
reference "subsec:Specifying-Aspect-Dependencies"
plural "false"
caps "false"
noprefix "false"
nolink "false"

\end_inset

).
\end_layout

\begin_layout Section

\family sans
\begin_inset CommandInset label
LatexCommand label
name "sec:Platform-Notes"

\end_inset


\family default
Platform Notes
\end_layout

\begin_layout Subsection
Ports
\end_layout

\begin_layout Standard
The 
\family typewriter
ac++
\family default
 compiler was originally developed on RedHat Linux systems.Today most of the development is still done under Linux (Debian and OpenSuse),
 but Windows has become a second development platform.
 This means that the Windows and Linux ports are the most tested.
 The MacOS X ports were compiled,
 because they were demanded by users,
 but they are far less tested than our development platform ports.
\end_layout

\begin_layout Subsubsection
Linux
\end_layout

\begin_layout Standard
The 
\family typewriter
ac++
\family default
 binary was tested on\SpecialChar ldots

\end_layout

\begin_layout Itemize
Debian 3.0,
 \SpecialChar ldots
,
 12.12 and various Ubuntu versions up to 25.10.
 Note that Debian and Ubuntu packages of AspectC++ are integrated into the distributions.
 They can be easily installed with 
\family typewriter
\size small
apt-get install aspectc++
\family default
\size default
.
\end_layout

\begin_layout Itemize
OpenSuse 8.2,
 ...,
 15.2
\end_layout

\begin_layout Subsubsection
Windows
\end_layout

\begin_layout Standard
Windows systems have different filename conventions than UNIX systems.
 Although 
\family typewriter
ac++
\family default
 was originally developed on Linux and does not use or need the Cygwin environment,
 path names are allowed to contain '
\family typewriter

\backslash

\family default
' characters and drive names like '
\family typewriter
C:
\family default
'.
 The UNIX filename delimiters '
\family typewriter
/
\family default
' are also accepted.
\end_layout

\begin_layout Standard
\begin_inset Note Comment
status collapsed

\begin_layout Plain Layout
The 
\family typewriter
ac++
\family default
 compiler saves files always conforming to the Windows newline conventions,
 i.e.
 lines always end with a CR and a LF character.
 As input files the UNIX and Windows conventions are accepted.
\end_layout

\end_inset


\end_layout

\begin_layout Standard

\emph on
Warning
\emph default
:
 
\family typewriter
ac++
\family default
 is not well tested on Windows.
 Use it only with code that is compatible with 
\family typewriter
g++
\family default
 or 
\family typewriter
clang++
\family default
.
 We recommend to use the 
\begin_inset Quotes eld
\end_inset

Windows Subsystem for Linux
\begin_inset Quotes erd
\end_inset

 with the Linux binary or a Linux-compatible shell as provided by MSYS2 with the Windows binary.
\end_layout

\begin_layout Subsubsection
MacOS
\end_layout

\begin_layout Standard
A MacOS port of the AspectC++ toolchain is available for MacOS/x86_64 as well as MacOS/arm.
 Note that the binaries provided at 
\begin_inset Flex URL
status open

\begin_layout Plain Layout

www.aspect.org
\end_layout

\end_inset

 are not verified by Apple.
 Therefore,
 MacOS asks you to trust the source of 
\family typewriter
ag++
\family default
 and 
\family typewriter
ac++
\family default
 before you can run them.
 We are very sorry for this inconvenience,
 but we are not willing to pay an annual fee to Apple.
\end_layout

\begin_layout Standard
We recommend to check out the AspectC++ source code and build the executable programs 
\family typewriter
ac++
\family default
 and 
\family typewriter
ag++
\family default
 locally.
 Thereby,
 they get a locally valid signature.
\end_layout

\begin_layout Subsection
\begin_inset CommandInset label
LatexCommand label
name "sec:back-end"

\end_inset

Back-End Compiler Support
\end_layout

\begin_layout Standard
The C++ compiler that should be used to compile the output of 
\family typewriter
ac++
\family default
 (back-end compiler) plays a very important role for 
\family typewriter
ac++
\family default
,
 because compilers normally come with header files,
 which 
\family typewriter
ac++
\family default
 must be able to parse.
 None of the back-end compilers listed here has totally standard-conforming header files,
 which makes it very hard for 
\family typewriter
ac++
\family default
 to parse all this code.
\end_layout

\begin_layout Standard
The current implementation of 
\family typewriter
ac++
\family default
 is based on the C++ parser of the LLVM/Clang project.
 Clang aims to be compatible with 
\family typewriter
g++
\family default
 and Visual C++,
 but there are always subtle differences.
 Development and testing is normally done on Linux with 
\family typewriter
g++
\family default
.
 The MacOS version uses the 
\family typewriter
g++
\family default
 command as well,
 but on MacOS 
\family typewriter
g++
\family default
 is alias for 
\family typewriter
clang++
\family default
.
 As a consequence parsing code of a 
\family typewriter
g++
\family default
 or 
\family typewriter
clang++
\family default
 project normally works well.
 Visual C++ compatibility hasn't been tested for years.
 So don't expect too much!
\end_layout

\begin_layout Standard
In the following we document compiler-specific problems.
\end_layout

\begin_layout Subsubsection
GNU g++
\end_layout

\begin_layout Standard
There are a lot of GNU g++ specific C++ extensions as well as several builtin functions and types.
 To enable all these extensions the option 
\family typewriter
--gnu
\family default
 has to be used.
 If a configuration file is generated with 
\family typewriter
ag++ --gen_config
\family default
,
 this option will be automatically inserted.
\end_layout

\begin_layout Standard
Compilers from the g++ family do not support explicit template specialization in a non-namespace scope.
 However,
 this feature is needed by ac++ in the code generation process.
 A workaround for this problem is automatically enabled when you use the 
\family typewriter
--gnu 
\emph on
<version>
\family default
\emph default
 option.
 To explicitly enable or disable the workaround use 
\family typewriter
--problem_spec_scope
\family default
 or 
\family typewriter
--no_problem_spec_scope
\family default
.
\end_layout

\begin_layout Subsubsection
Tricore/GNU g++
\end_layout

\begin_layout Standard
Unfortunately,
 the freely available variant of LLVM/Clang,
 i.e.
 the parser of 
\family typewriter
ac++
\family default
,
 does not support the Infineon AURIX Tricore platform.
 As 
\family typewriter
ac++
\family default
 doesn't need machine code generation for this platform,
 we were able to find a workaround so that Tricore projects can be compiled with 
\family typewriter
ac++
\family default
/
\family typewriter
ag++
\family default
 with only minimal limitations.
 If the parser configuration file contains the option 
\family typewriter
--target tricore
\family default
 or 
\family typewriter
--target tricore-elf
\family default
,
 the internal Clang parser is configured with the name of a very similar target architecture.
 Incompatibilities in the size and alignment values of built-in data types are fixed so that the front end and the back end have the same view on data structure layouts.
\end_layout

\begin_layout Standard
Warning:
 A known problem is that Clang checks whether CPU register names in inline assembler code are valid for the respective platform.
 It is not possible to fix this register list without having to patch the Clang parser.
 Therefore,
 we decided to skip all token sequences of the form 
\begin_inset Quotes eld
\end_inset


\family typewriter
asm volatile
\begin_inset Formula $_{opt}$
\end_inset

(
\family default
…
\family typewriter
)
\family default

\begin_inset Quotes erd
\end_inset

 completely during the code analysis.
 This avoids any error messages related to unknown register names.
 However,
 if the inline assembler code statement contains C++ code with a function call or other kind of AspectC++ join point,
 it will not be seen by 
\family typewriter
ac++
\family default
 as well.
 In most use cases for 
\family typewriter
asm
\family default
 statements it only contains assembler code and register names.
\end_layout

\begin_layout Subsubsection
\begin_inset CommandInset label
LatexCommand label
name "sec:cygwin_back_end"

\end_inset

Cygwin/GNU g++
\end_layout

\begin_layout Standard
The 
\family typewriter
ac++
\family default
 compiler can also be used with the Cygwin/GNU g++ compiler under Windows.
 Note,
 that 
\family typewriter
ac++
\family default
 itself is not a Cygwin application and,
 thus,
 does not support Cygwin-specific path names like 
\family typewriter
/home/olaf
\family default
,
 which is relative to the cygwin installation directory.
 If you generate your parser configuration file automatically with 
\family typewriter
ag++ --gen_config
\family default
 the contained include paths will automatically be converted from Cygwin paths names to Windows path names using the 
\family typewriter
cygpath
\family default
 command.
 However,
 be careful when you set the 
\family typewriter
PUMA_CONFIG
\family default
 environment variable or when you pass any other path name to 
\family typewriter
ac++
\family default
.
 Furthermore,
 
\family typewriter
ac++
\family default
 and 
\family typewriter
ag++
\family default
 don't support Cygwin file links.
 This might also cause compilation problems.
 A known problem is that in some Cygwin versions 
\family typewriter
g++
\family default
 itself is a link to 
\family typewriter
g++-
\family default
\emph on
<version>
\emph default
.
 This means that it will not be found by 
\family typewriter
ag++
\family default
.
 It helps to provide the proper compiler name with the 
\family typewriter
--c_compiler g++-
\emph on
<version>
\family default
\emph default
 option.
\end_layout

\begin_layout Subsubsection
MS VC++
\end_layout

\begin_layout Standard

\emph on
Warning
\emph default
:
 Using ac++ in combination with MS VC++ is problematic.
 It hasn't been tested for quite some time.
\end_layout

\begin_layout Section

\family sans
\begin_inset CommandInset label
LatexCommand label
name "sec:Problems"

\end_inset


\family default
Problems & Workarounds
\end_layout

\begin_layout Subsection
\begin_inset CommandInset label
LatexCommand label
name "sec:pitfalls"

\end_inset

Common Pitfalls
\end_layout

\begin_layout Subsubsection
\begin_inset CommandInset label
LatexCommand label
name "sec:Include-Cycles"

\end_inset

Include Cycles
\end_layout

\begin_layout Standard
In versions prior to 1.0pre1 include cycles could occur in many situations and workarounds could not always be found.
 In version 1.0pre1 include cycles can only occur in the case of aspect code with introductions.
 Advice for code join points cannot produce cycles.
\end_layout

\begin_layout Standard
The reason for the remaining possible cycles is that 
\family typewriter
ac++
\family default
 generates 
\family typewriter
#include <aspect-header>
\family default
 in every file that contains the definition of a target class of an introduction.
 Without this generation pattern definitions from the aspect header would not be accessible by introduced code.
 However,
 if the aspect header directly or indirectly includes the target file,
 there is a cycle,
 which might cause parse errors.
\end_layout

\begin_layout Standard
\begin_inset Float figure
placement document
alignment document
wide false
sideways false
status open

\begin_layout Plain Layout
\align center
\begin_inset Graphics
	filename images/include_cycle.svg
	lyxscale 50
	width 10cm

\end_inset


\end_layout

\begin_layout Plain Layout
\begin_inset Caption Standard

\begin_layout Plain Layout
\begin_inset CommandInset label
LatexCommand label
name "fig:inc_cycle"

\end_inset

Include cycle problem
\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Standard
Figure 
\begin_inset CommandInset ref
LatexCommand ref
reference "fig:inc_cycle"
nolink "false"

\end_inset

 illustrates the include cycle problem by giving an example.
 Here an aspect 
\family typewriter
\size small
Problem
\family default
\size default
 uses the type 
\family typewriter
\size small
Target
\family default
\size default
 and therefore includes 
\family typewriter
\size small
Target.h
\family default
\size default
.
 At the same time the aspect introduces a slice into the class 
\family typewriter
\size small
Target
\family default
\size default
.
 As the slice might depend on definitions or 
\family typewriter
\size small
#include
\family default
\size default
s in 
\family typewriter
\size small
Problem.ah
\family default
\size default
,
 the weaver generates the 
\family typewriter
\size small
#include
\begin_inset space ~
\end_inset

"Problem.ah
\family default
\size default
" in 
\family typewriter
\size small
Target.h
\family default
\size default
.
 This causes the include cycle.
 Include guards (which should always be used!) avoid duplicate definitions,
 but do not solve the problem.
 It might still be the case that the parser complains about undefined types.
\end_layout

\begin_layout Standard
To avoid these cycles introductions can always be separated from the aspect by means of slices.
 Slice declarations and slice member definitions can be located in arbitrary aspect header files.
 The aspect weaver will only include these aspect headers in the target classes' header/implementation files and thereby avoid the cycle.
 For a slice reference within an advice declaration even a forward declaration of the slice is sufficient.
\end_layout

\begin_layout Standard
\begin_inset Float figure
placement document
alignment document
wide false
sideways false
status open

\begin_layout Plain Layout
\align center
\begin_inset Graphics
	filename images/no_include_cycle.svg
	lyxscale 50
	width 9cm

\end_inset


\end_layout

\begin_layout Plain Layout
\begin_inset Caption Standard

\begin_layout Plain Layout
\begin_inset CommandInset label
LatexCommand label
name "fig:no_inc_cycle"

\end_inset

Include cycle avoidance
\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Standard
Figure 
\begin_inset CommandInset ref
LatexCommand ref
reference "fig:no_inc_cycle"
nolink "false"

\end_inset

 shows how the include cycle from the example in Figure 
\begin_inset CommandInset ref
LatexCommand ref
reference "fig:inc_cycle"
nolink "false"

\end_inset

 can be avoided.
 Here the function 
\family typewriter
\size small
dump
\family default
\size default
 is implemented in a separate slice class 
\family typewriter
\size small
Dump
\family default
\size default
 that is stored in an aspect header file 
\family typewriter
\size small
Dump.ah
\family default
\size default
.
 The implementation of 
\family typewriter
\size small
Dump
\family default
\size default
 could rely on defintions and 
\family typewriter
\size small
#include
\family default
\size default
s in 
\family typewriter
\size small
Dump.ah
\family default
\size default
 (
\family typewriter
\size small
stdio.h
\family default
\size default
 in this example),
 but not on defintions in 
\family typewriter
\size small
Problem.ah
\family default
\size default
.
 Therefore,
 the aspect weaver generates 
\family typewriter
\size small
#include
\begin_inset space ~
\end_inset

"Dump.ah"
\family default
\size default
 and not 
\family typewriter
\size small
#include
\begin_inset space ~
\end_inset

"Problem.ah"
\family default
\size default
 in 
\family typewriter
\size small
Target.h
\family default
\size default
.
\end_layout

\begin_layout Standard
Note that in the case of 
\series bold
non-inline
\series default
 introductions the #include directive is generated in the file that contains the 
\begin_inset Quotes eld
\end_inset

link-once element
\begin_inset Quotes erd
\end_inset

 of the target class,
 which is never a header file.
 You can,
 for example,
  exploit this feature to produce cyclic class relationships.
 The included file will be the aspect header file that contains the definition of the non-inline slice member.
\end_layout

\begin_layout Subsubsection
\begin_inset CommandInset label
LatexCommand label
name "sec:dup-forced-includes"

\end_inset

Duplicate Forced Includes in STU Mode
\end_layout

\begin_layout Standard
In the Single Translation Unit (STU) mode 
\family typewriter
ac++
\family default
 handles forced includes (see 
\family typewriter
-include
\family default
 option in Section 
\begin_inset CommandInset ref
LatexCommand vref
reference "sec:option_include"
nolink "false"

\end_inset

) in the following way:
\end_layout

\begin_layout Description
internal
\begin_inset space ~
\end_inset

includes:
 If the included file is part of your project,
 the file content will be expanded in the compiled translation unit.
\end_layout

\begin_layout Description
external
\begin_inset space ~
\end_inset

includes:
 If the included file is 
\emph on
not
\emph default
 part of the project,
 ac++ generates an #include directive with the absolute path name of the file.
\end_layout

\begin_layout Standard
In both cases the back-end compiler should not be forced to include the same file again.
 For example,
 
\family typewriter
g++
\family default
 users should not use the 
\family typewriter
\size small
-include
\family default
\size default
 option with 
\family typewriter
\size small
ac++
\family default
\size default
 and with 
\family typewriter
g++
\family default
,
 because otherwise symbols might be defined twice.
\end_layout

\begin_layout Subsubsection
Compiling libraries
\end_layout

\begin_layout Standard
There are certain restrictions on the code structure if 
\family typewriter
\size small
ac++
\family default
\size default
 should generate transformed header files for an aspect-oriented C++ 
\emph on
library
\emph default
.
 For instance,
 all header files need "include guards" and should not depend on the context by which they are included.
 Furthermore all headers must have the extension 
\family typewriter
\size small
.h
\family default
\size default
.
\end_layout

\begin_layout Standard
Furthermore,
 users have to be careful 
\emph on
not
\emph default
 to generate transformed headers into the project directory tree (
\family typewriter
\size small
-p
\family default
\size default
 option).
 Otherwise,
 the 
\emph on
next
\emph default
 compilation of the library is likely to fail,
 because 
\family typewriter
\size small
ac++
\family default
\size default
 would search aspect header files in the generated directory tree.
\end_layout

\begin_layout Subsubsection
Project structure
\end_layout

\begin_layout Standard
The AspectC++ weaver 
\family typewriter
\size small
ac++
\family default
\size default
 expects that "projects" do not overlap,
 have no cyclic dependencies,
 and can be described by a list of directory names (
\family typewriter
\size small
-p
\family default
\size default
 option).
 AspectC++ needs the notion of a "project" in order to restrict the set files that are affected by the aspects.
 Sometimes big applications are organized in multiple projects within the same workspace and have arbitrary dependencies (include relations) to each other.
 For these applications selecting the 
\family typewriter
\size small
-p
\family default
\size default
 option is sometimes difficult.
 Often treating the whole workspace as one AspectC++ project is the best solution.
\end_layout

\begin_layout Subsubsection
The 
\family typewriter
\size small
--aspect_header
\family default
\size default
 option
\end_layout

\begin_layout Standard
This option can be used to avoid that 
\family typewriter
\size small
ac++
\family default
\size default
 automatically searches all aspect header files in the project directory tree.
 It is to be made sure by the user that each aspect header file is included 
\emph on
only once
\emph default
.
 If no aspect headers should be taken into account,
 the option 
\begin_inset Quotes eld
\end_inset


\family typewriter
\size small
-a 0
\family default
\size default

\begin_inset Quotes erd
\end_inset

 has to be used.
\end_layout

\begin_layout Subsection
Unimplemented Features
\end_layout

\begin_layout Subsubsection
Multi-Threading Support
\end_layout

\begin_layout Standard
C++ has no integrated thread model like Java.
 Therefore,
 the woven AspectC++ code cannot rely on any available thread synchronization mechanism.
 As a result the implementation of the 
\family typewriter
\size small
cflow
\family default
\size default
 pointcut functions is currently 
\emph on
not thread-safe
\emph default
.
\end_layout

\begin_layout Standard
We are urgently investigating how thread synchronization and thread local storage can be integrated into AspectC++.
\end_layout

\begin_layout Subsubsection
C++ 11/14/...
\begin_inset CommandInset label
LatexCommand label
name "subsec:C++-11"

\end_inset


\end_layout

\begin_layout Standard

\family typewriter
ac++
\family default
 does not fully support the latest language features introduced with the C++ 11 standard.
 These features,
 such as lambda functions or move constructors,
 are accepted by the underlying parser (the Clang framework,
 which is used in 
\family typewriter
ac++
\family default
 2.x),
 but the weaver can't deal with these features,
 yet.
 Therefore,
 it is safe to use C++ 11 code as long as the code affected by advice conforms to C++ 2003.
\end_layout

\begin_layout Subsubsection
Parse Errors
\end_layout

\begin_layout Standard
If 
\family typewriter
\size small
ac++
\family default
\size default
 stops processing because of parse errors this might be due to an incompatibility or missing feature in the underlying C++ parser.
\end_layout

\begin_layout Standard
In the case that the error is found in your own code,
 i.e.
 code you are able to modify,
 you could use the following workaround:
\end_layout

\begin_layout Standard

\size small
\begin_inset Flex Color Box
status open

\begin_layout Plain Layout

\size small
\begin_inset listings
lstparams "language={[ISO]{C++}}"
inline false
status open

\begin_layout Plain Layout

#ifdef __acweaving
\end_layout

\begin_layout Plain Layout

// ...
 simplified version of the code for ac++
\end_layout

\begin_layout Plain Layout

#else
\end_layout

\begin_layout Plain Layout

// ...
 original code
\end_layout

\begin_layout Plain Layout

#endif
\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Standard
Even if your own AspectC++ code contains only harmless C++ code you might experience parsing problems due to header files from libraries which your application code includes,
 especially in the case of template libraries.
 In this situation it might help to copy the file with the parse error into a different directory.
 Then you have to change the code in this file to avoid the error message by simplifying it.
 The final step is to extend the 
\family typewriter
\size small
puma.config
\family default
\size default
 file by a 
\family typewriter
\size small

\begin_inset Quotes eld
\end_inset

-I <path>
\family default
\size default

\begin_inset Quotes erd
\end_inset

 entry for the directory where you placed the copy.
 As the result 
\family typewriter
\size small
ac++
\family default
\size default
 will now parse the simplified version while the original file is untouched and used while the C++ compiler runs.
\end_layout

\begin_layout Subsubsection
Templates
\end_layout

\begin_layout Standard
Currently 
\family typewriter
\size small
ac++
\family default
\size default
 is able to parse a lot of the (really highly complicated) C++ templates,
 but weaving is restricted to non-templated code only.
 That means you can not weave in templates or even affect calls to template functions or members of template classes.
 However,
 template instances can be matched by match expressions in the pointcut language and calls to members of class templates or template functions can be affected by advice.
\end_layout

\begin_layout Subsubsection
Macros
\end_layout

\begin_layout Standard
In versions prior to 1.0 the weaver was not able at all to transform code that was generated by macro expansion.
 It simply printed a warning and continued without transforming the code.
 To turn this warning off the command line option 
\family typewriter
\size small
--no_warn_macro
\family default
\size default
 could be used (see Table 
\begin_inset CommandInset ref
LatexCommand vref
reference "tab:warnings"
nolink "false"

\end_inset

).
\end_layout

\begin_layout Standard
The current solution is to expand a macro whenever it is affected by aspects and do the weaving afterwards.
 While this works fine for most cases,
 problems may occur if the macro definition used by the (cross-)compiler differs from the one used by ac++.
 Future releases will thus distinguish between macros definitions that belong to the project and can safely be expanded and macros that were defined outside the project.
\end_layout

\begin_layout Subsubsection
Unimplemented Language Elements
\end_layout

\begin_layout Description

\family typewriter
cflow
\family default
 does not yet support exposure of context information.
\end_layout

\begin_layout Description

\family typewriter
base
\family default
 only works as expected if all classes that should be matched by the pointcut function's argument are known in the translation unit.
 Therefore,
 the aspect header file has to contain the right set of include directives.
\end_layout

\begin_layout Subsubsection
Support for Plain C Code
\end_layout

\begin_layout Standard
Currently 
\family typewriter
\size small
ac++
\family default
\size default
 generates C++ code,
 which cannot be compiled by a C compiler.
 As for many hardware platforms in the embedded domain no C++ compiler is available we are actively looking for a solution.
\end_layout

\begin_layout Subsubsection
Support for C++ language extensions
\end_layout

\begin_layout Standard
The parser fully supports the language features of C++ 11 and more recent standards (see 
\begin_inset CommandInset ref
LatexCommand ref
reference "subsec:C++-11"
nolink "false"

\end_inset

),
 but the AspectC++ language and the code transformation patterns have not been extended,
 yet.
 Make sure that match expressions don't match functions with signatures that contain elements that did not exist in C++ 03.
 Since version 2.3 
\family typewriter
constexpr
\family default
 functions are not matched automatically.
\end_layout

\begin_layout Subsubsection
Constructor/Destructor Generation
\end_layout

\begin_layout Standard
If advice for construction/destruction joinpoints is given and no constructor/destructor is defined explicitly,
 
\family typewriter
\size small
ac++
\family default
\size default
 will generate it.
 However,
 currently 
\family typewriter
\size small
ac++
\family default
\size default
 assumes that the copy constructor has one argument of type 
\begin_inset Quotes eld
\end_inset


\family typewriter
\size small
const <Classname>&
\family default
\size default

\begin_inset Quotes erd
\end_inset

.
 This leads to problems if the implicitly declared copy constructor has an argument of type 
\begin_inset Quotes eld
\end_inset


\family typewriter
\size small
<Classname>&
\family default
\size default

\begin_inset Quotes erd
\end_inset

.
 Therefore,
 you should not define construction/destruction advice for classes with this copy constructor signature.
\end_layout

\begin_layout Standard
Further problems appear when an a class instance is aggregate initialized.
 The automatic constructor generation can break this ability.
 
\end_layout

\begin_layout Subsubsection
Functions with variable argument lists
\end_layout

\begin_layout Standard
There is no support for execution advice on functions with variable argument lists.
 A warning will be issued.
 There is no portable way to generate a wrapper function for this class of functions.
\end_layout

\begin_layout Subsubsection
Restrictions on calling 
\family typewriter
\size small
tjp->proceed()
\end_layout

\begin_layout Standard
Due to a problem with result object construction/destruction of intercepted functions,
 the 
\family typewriter
\size small
tjp->proceed()
\family default
\size default
 function may only be called 
\emph on
once
\emph default
 during around advice.
\end_layout

\begin_layout Subsubsection
Advice on advice
\end_layout

\begin_layout Standard
Join points within advice code are not matched by pointcut expressions.
\end_layout

\begin_layout Subsubsection
JoinPoint-API for slices
\end_layout

\begin_layout Standard
There is a joinpoint-API for slices introduced into a target class.
 It provides static type information about the target's baseclasses and members as well as dynamic information,
 such as a pointer to each member.
 However,
 the baseclass part of the slice may not access the JoinPoint-API.
 This is partly natural,
 as,
 for instance,
 member types might depend on the introduced baseclass.
 Yet,
 not even the target's classname is available.
 Future versions might make this possible.
\end_layout

\begin_layout Standard
The identifier 'JoinPoint' is only to be used to access the joinpoint-API.
 Even though it would conceptually make sense to allow,
 for instance,
 a local variable to be called 'JoinPoint',
 it is not supported,
 yet.
\end_layout

\begin_layout Standard
\begin_inset Newpage newpage
\end_inset


\end_layout

\begin_layout Section
Code Transformation
\end_layout

\begin_layout Standard
This section documents some internals of the 
\family typewriter
ac++
\family default
 weaver implementation and describes .acc file content.
\end_layout

\begin_layout Subsection
Typical Patterns in Woven Source Code (.acc) Files
\end_layout

\begin_layout Subsubsection
Namespace AC
\end_layout

\begin_layout Standard
Woven .acc code begins with the declaration of the AC namespace.
 The first AC declaration consists of typedefs,
 templates and helper functions that may be useful for your aspects.
 They might also not be used at all.
 For that purpose you might ignore it for now and use it to look up if some contents appear in your aspects later on.
 Below the AC declaration,
 your aspects will be declared and your woven code begins.
\end_layout

\begin_layout Standard
\begin_inset Flex Color Box
status open

\begin_layout Plain Layout
\begin_inset listings
lstparams "language={C++},basicstyle={\footnotesize\ttfamily}"
inline false
status open

\begin_layout Plain Layout

namespace AC {
\end_layout

\begin_layout Plain Layout

  ...
\end_layout

\begin_layout Plain Layout

  #Typedefs,
 Templates & Functions usable by Aspects
\end_layout

\begin_layout Plain Layout

  ...
\end_layout

\begin_layout Plain Layout

}
\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Subsubsection
Include Expansion
\end_layout

\begin_layout Standard
Includes that are part of the project directory tree will be expanded into .acc code.
 Below you can see how an example header file 
\begin_inset Quotes eld
\end_inset

hello.h
\begin_inset Quotes erd
\end_inset

 is included into a .acc file.
 The content is copied and the include line is commented out.
 Notice that 
\family typewriter
#include <iostream>
\family default
 remains as a regular include.
 That is because 
\family typewriter
<iostream>
\family default
 is not part of our project directory tree.
 The project directory tree is by default the current working directory or can be specified with parameters 
\family typewriter
-p /-–path
\family default
 (See 
\begin_inset CommandInset ref
LatexCommand ref
reference "sec:-p| --path"
plural "false"
caps "false"
noprefix "false"
nolink "false"

\end_inset

).
 Double includes will be ignored by 
\family typewriter
ac++
\family default
.
\end_layout

\begin_layout Standard
\begin_inset Flex Color Box
status open

\begin_layout Plain Layout
\begin_inset listings
lstparams "language={C++},basicstyle={\footnotesize\ttfamily}"
inline false
status open

\begin_layout Plain Layout

// commented out by ac++:
 #include "hello.h"
\end_layout

\begin_layout Plain Layout

#line 1 "example/hello.h"
\end_layout

\begin_layout Plain Layout

#ifndef __HELLO_H__
\end_layout

\begin_layout Plain Layout

#define __HELLO_H__
\end_layout

\begin_layout Plain Layout

\end_layout

\begin_layout Plain Layout

#include <iostream>
\end_layout

\begin_layout Plain Layout

\end_layout

\begin_layout Plain Layout

void hello(){
\end_layout

\begin_layout Plain Layout

  std::cout << "Hello" << std::endl;
\end_layout

\begin_layout Plain Layout

}
\end_layout

\begin_layout Plain Layout

#endif
\end_layout

\begin_layout Plain Layout

#line 94 "example/main.cc"
\end_layout

\begin_layout Plain Layout

\end_layout

\begin_layout Plain Layout

int main(){
\end_layout

\begin_layout Plain Layout

  hello();
 //print "Hello"
\end_layout

\begin_layout Plain Layout

  return 0;
\end_layout

\begin_layout Plain Layout

}
\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Subsubsection
#line Directives
\end_layout

\begin_layout Standard
For debugging and compiling purposes,
 the woven source code contains 
\family typewriter
#line
\family default
\emph on
 
\emph default
directives.
 For example the line 
\family typewriter
#line 10 main.cc
\family default
 will signal the compiler that the content below it is from (and starts at) line 10 of the original main.cc file.
 That way compiler error messages are able to link to the original project files and a debugger can refer to the original source files instead of the woven files.
\end_layout

\begin_layout Standard
\begin_inset Flex Color Box
status open

\begin_layout Plain Layout
\begin_inset listings
lstparams "language={C++},basicstyle={\footnotesize\ttfamily}"
inline false
status open

\begin_layout Plain Layout

#line 1 "example/hello.h"
\end_layout

\begin_layout Plain Layout

#ifndef __HELLO_H__
\end_layout

\begin_layout Plain Layout

#define __HELLO_H__
\end_layout

\begin_layout Plain Layout

\end_layout

\begin_layout Plain Layout

#include <iostream>
\end_layout

\begin_layout Plain Layout

\end_layout

\begin_layout Plain Layout

void hello(){
\end_layout

\begin_layout Plain Layout

  std::cout << "Hello" << std::endl;
\end_layout

\begin_layout Plain Layout

}
\end_layout

\begin_layout Plain Layout

#endif
\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Subsection
Aspects in Woven Code
\end_layout

\begin_layout Subsubsection
Aspects Become Classes 
\end_layout

\begin_layout Standard
In woven .acc code,
 aspects are converted to classes.
 Advice will be translated as public methods that are named in the following schema:
 
\family typewriter
__a0_after()
\family default
.
 
\emph on
a0
\emph default
 meaning the advice index (a0 is the first advice in its class / aspect) and 
\emph on
after
\emph default
 describing what kind of advice is used.
 See below for a simple example of aspect translation in woven code.
\end_layout

\begin_layout Standard
\begin_inset Flex Color Box
status open

\begin_layout Plain Layout
\begin_inset listings
lstparams "basicstyle={\footnotesize\ttfamily},language={[Aspect]C++}"
inline false
status open

\begin_layout Plain Layout

aspect World {
\end_layout

\begin_layout Plain Layout

  advice execution("void hello()") :
 after() {
\end_layout

\begin_layout Plain Layout

    //print "World" after execution of the 'hello()' function
\end_layout

\begin_layout Plain Layout

    std::cout << "World" << std::endl;
\end_layout

\begin_layout Plain Layout

  }
\end_layout

\begin_layout Plain Layout

};
\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Standard
\begin_inset VSpace halfline
\end_inset


\end_layout

\begin_layout Standard
\begin_inset Flex Color Box
status open

\begin_layout Plain Layout
\begin_inset listings
lstparams "language={C++},basicstyle={\footnotesize\ttfamily}"
inline false
status open

\begin_layout Plain Layout

class World {
\end_layout

\begin_layout Plain Layout

  public:
 void __a0_after() {
\end_layout

\begin_layout Plain Layout

    std::cout << "World" << std::endl;
\end_layout

\begin_layout Plain Layout

  }
\end_layout

\begin_layout Plain Layout

  ...
\end_layout

\begin_layout Plain Layout

}
\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Subsubsection
Singleton Pattern and Invoke Function
\end_layout

\begin_layout Standard
By default Aspects are instantiated using the singleton design pattern.
 They provide an 
\family typewriter
aspectof()
\family default
 function to obtain a pointer to the singleton object.
 For each advice,
 an invoke function is generated that accesses the singleton and calls the advice (see 
\family typewriter
invoke_World_World__a0_after
\family default
).
 Generally,
 a lot of transformed code functions will be inline functions,
 preventing call and return instructions to affect code runtime.
 Note that the example below also shows an 
\family typewriter
aspectOf()
\family default
 getter.
 
\family typewriter
aspectOf()
\family default
 was the default getter in AspectJ and is now deprecated in AspectC++.
\end_layout

\begin_layout Standard
\begin_inset Flex Color Box
status open

\begin_layout Plain Layout
\begin_inset listings
lstparams "language={C++},basicstyle={\footnotesize\ttfamily}"
inline false
status open

\begin_layout Plain Layout

public:
\end_layout

\begin_layout Plain Layout

  static World *aspectof () {
\end_layout

\begin_layout Plain Layout

    static World __instance;
\end_layout

\begin_layout Plain Layout

    return &__instance;
\end_layout

\begin_layout Plain Layout

  }
\end_layout

\begin_layout Plain Layout

  static World *aspectOf () {
\end_layout

\begin_layout Plain Layout

    return aspectof ();
\end_layout

\begin_layout Plain Layout

  }
\end_layout

\end_inset


\end_layout

\end_inset


\begin_inset VSpace halfline
\end_inset


\end_layout

\begin_layout Standard
\begin_inset Flex Color Box
status open

\begin_layout Plain Layout
\begin_inset listings
lstparams "language={C++},basicstyle={\footnotesize\ttfamily}"
inline false
status open

\begin_layout Plain Layout

namespace AC {
\end_layout

\begin_layout Plain Layout

  __attribute((always_inline)) inline
\end_layout

\begin_layout Plain Layout

    void invoke_World_World__a0_after () 
\end_layout

\begin_layout Plain Layout

  {
\end_layout

\begin_layout Plain Layout

    ::World::aspectof()->__a0_after ();
\end_layout

\begin_layout Plain Layout

  }
\end_layout

\begin_layout Plain Layout

} 
\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Subsection
Basic Code Transformation Patterns
\end_layout

\begin_layout Standard
In this section,
 you will find simplified examples of the code transformation patterns of predefined pointcut functions.
 There may be some exceptions to these examples but they should be helpful in understanding how aspects are woven and how aspects and C++ code interact with each other.
 Code that is not important for understanding the weaving process is cut out of the examples.
 Code is also reformatted for better readability.
 These examples are organized in the following schema:
\end_layout

\begin_layout Standard
\begin_inset Flex Color Box
status open

\begin_layout Plain Layout

\family typewriter
Listing with Aspect to be applied
\end_layout

\end_inset


\end_layout

\begin_layout Standard
\begin_inset Flex Color Box
status open

\begin_layout Plain Layout

\family typewriter
Listing with Example Code
\end_layout

\end_inset


\end_layout

\begin_layout Standard
\begin_inset Flex Color Box
status open

\begin_layout Plain Layout

\family typewriter
Listing with Transformed / Woven Code
\end_layout

\end_inset


\end_layout

\begin_layout Subsubsection
Execution
\end_layout

\begin_layout Standard
\begin_inset Flex Color Box
status open

\begin_layout Plain Layout
\begin_inset listings
lstparams "basicstyle={\footnotesize\ttfamily},language={[Aspect]{C++}}"
inline false
status open

\begin_layout Plain Layout

aspect World {
\end_layout

\begin_layout Plain Layout

  advice execution("void hello()") :
 after() {
\end_layout

\begin_layout Plain Layout

    //print "World" after execution of 'void hello()'
\end_layout

\begin_layout Plain Layout

    std::cout << "World" << std::endl;
\end_layout

\begin_layout Plain Layout

  }
\end_layout

\begin_layout Plain Layout

};
\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Standard
\begin_inset Flex Color Box
status open

\begin_layout Plain Layout
\begin_inset listings
lstparams "language={C++},basicstyle={\footnotesize\ttfamily}"
inline false
status open

\begin_layout Plain Layout

void hello(){
\end_layout

\begin_layout Plain Layout

  std::cout << "Hello" << std::endl;
\end_layout

\begin_layout Plain Layout

}
\end_layout

\begin_layout Plain Layout

\end_layout

\begin_layout Plain Layout

int main(){
\end_layout

\begin_layout Plain Layout

  hello();
\end_layout

\begin_layout Plain Layout

  return 0;
\end_layout

\begin_layout Plain Layout

}
\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Standard
\begin_inset Flex Color Box
status open

\begin_layout Plain Layout
\begin_inset listings
lstparams "language={C++},basicstyle={\footnotesize\ttfamily}"
inline false
status open

\begin_layout Plain Layout

class World{
\end_layout

\begin_layout Plain Layout

  public:
 void __a0_after() {
\end_layout

\begin_layout Plain Layout

    std::cout << "World" << std::endl;
\end_layout

\begin_layout Plain Layout

  }
\end_layout

\begin_layout Plain Layout

};
\end_layout

\begin_layout Plain Layout

\end_layout

\begin_layout Plain Layout

inline void __exec_old_hello(){
\end_layout

\begin_layout Plain Layout

  std::cout << "Hello" << std::endl;
\end_layout

\begin_layout Plain Layout

}
\end_layout

\begin_layout Plain Layout

\end_layout

\begin_layout Plain Layout

void hello(){
\end_layout

\begin_layout Plain Layout

  ::__exec_old_hello();
 // print 
\begin_inset Quotes eld
\end_inset

Hello
\begin_inset Quotes erd
\end_inset


\end_layout

\begin_layout Plain Layout

  AC::invoke_World_World__a0_after ();
 // print 
\begin_inset Quotes eld
\end_inset

World
\begin_inset Quotes erd
\end_inset


\end_layout

\begin_layout Plain Layout

}
\end_layout

\begin_layout Plain Layout

\end_layout

\begin_layout Plain Layout

int main(){
\end_layout

\begin_layout Plain Layout

  hello();
\end_layout

\begin_layout Plain Layout

  return 0;
\end_layout

\begin_layout Plain Layout

}
\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Standard
When an execution advice is applied,
 the executed function is replaced by a wrapper function that calls the advice at the specified point and also calls the original function,
 which is put into a new separate inline function ( __exec_old_
\emph on
function_name
\emph default
).
 
\end_layout

\begin_layout Subsubsection
Call
\end_layout

\begin_layout Standard
\begin_inset Flex Color Box
status open

\begin_layout Plain Layout
\begin_inset listings
lstparams "basicstyle={\footnotesize\ttfamily},language={[Aspect]{C++}}"
inline false
status open

\begin_layout Plain Layout

aspect Hello {
\end_layout

\begin_layout Plain Layout

  advice call("void world()") :
 before() {
\end_layout

\begin_layout Plain Layout

    // print 
\begin_inset Quotes eld
\end_inset

Hello
\begin_inset Quotes erd
\end_inset

 before void world() is called
\end_layout

\begin_layout Plain Layout

    std::cout << "Hello" << std::endl;
\end_layout

\begin_layout Plain Layout

  }
\end_layout

\begin_layout Plain Layout

};
\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Standard
\begin_inset Flex Color Box
status open

\begin_layout Plain Layout
\begin_inset listings
lstparams "language={C++},basicstyle={\footnotesize\ttfamily}"
inline false
status open

\begin_layout Plain Layout

void world(){
\end_layout

\begin_layout Plain Layout

  std::cout << "World" << std::endl;
\end_layout

\begin_layout Plain Layout

}
\end_layout

\begin_layout Plain Layout

\end_layout

\begin_layout Plain Layout

int main(){
\end_layout

\begin_layout Plain Layout

  world();
\end_layout

\begin_layout Plain Layout

  return 0;
\end_layout

\begin_layout Plain Layout

}
\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Standard
\begin_inset Flex Color Box
status open

\begin_layout Plain Layout
\begin_inset listings
lstparams "language={C++},basicstyle={\footnotesize\ttfamily}"
inline false
status open

\begin_layout Plain Layout

class Hello{
\end_layout

\begin_layout Plain Layout

  public:
 void __a0_before() {
\end_layout

\begin_layout Plain Layout

    std::cout << "Hello" << std::endl;
\end_layout

\begin_layout Plain Layout

  }
\end_layout

\begin_layout Plain Layout

};
\end_layout

\begin_layout Plain Layout

\end_layout

\begin_layout Plain Layout

void world(){
\end_layout

\begin_layout Plain Layout

  std::cout << "World" << std::endl;
\end_layout

\begin_layout Plain Layout

}
\end_layout

\begin_layout Plain Layout

\end_layout

\begin_layout Plain Layout

inline void __Call__Z4mainv_0_0 (){
\end_layout

\begin_layout Plain Layout

  AC::invoke_Hello_Hello__a0_before ();
 // print 
\begin_inset Quotes eld
\end_inset

Hello
\begin_inset Quotes erd
\end_inset


\end_layout

\begin_layout Plain Layout

  ::world();
 // print 
\begin_inset Quotes eld
\end_inset

World
\begin_inset Quotes erd
\end_inset


\end_layout

\begin_layout Plain Layout

}
\end_layout

\begin_layout Plain Layout

\end_layout

\begin_layout Plain Layout

int main(){
\end_layout

\begin_layout Plain Layout

  __Call__Z4mainv_0_0 ( );
\end_layout

\begin_layout Plain Layout

  return 0;
\end_layout

\begin_layout Plain Layout

}
\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Standard
In comparison to execution advice,
 call advice do not replace the executed function with a wrapper function,
 but rather wrap it with a new inline function when it is called.
 The wrapper function also calls the advice at specified position.
\end_layout

\begin_layout Subsubsection
Construction
\end_layout

\begin_layout Standard
\begin_inset Flex Color Box
status open

\begin_layout Plain Layout
\begin_inset listings
lstparams "basicstyle={\footnotesize\ttfamily},language={[Aspect]{C++}}"
inline false
status open

\begin_layout Plain Layout

aspect Hello {
\end_layout

\begin_layout Plain Layout

  advice construction("World") :
 after() {
\end_layout

\begin_layout Plain Layout

    std::cout << "- Hello World" << std::endl;
\end_layout

\begin_layout Plain Layout

  } // printed when World instance is constructed
\end_layout

\begin_layout Plain Layout

};
\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Standard
\begin_inset Flex Color Box
status open

\begin_layout Plain Layout
\begin_inset listings
lstparams "language={C++},basicstyle={\footnotesize\ttfamily}"
inline false
status open

\begin_layout Plain Layout

class World{ // Class with simple constructor
\end_layout

\begin_layout Plain Layout

  public:
 World(){std::cout << 
\begin_inset Quotes eld
\end_inset

New World created
\begin_inset Quotes erd
\end_inset

;}
\end_layout

\begin_layout Plain Layout

};
\end_layout

\begin_layout Plain Layout

\end_layout

\begin_layout Plain Layout

int main(){
\end_layout

\begin_layout Plain Layout

  World A = World();
 //Construct 
\begin_inset Quotes eld
\end_inset

World
\begin_inset Quotes erd
\end_inset

 instance
\end_layout

\begin_layout Plain Layout

  return 0;
\end_layout

\begin_layout Plain Layout

}
\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Standard
\begin_inset Flex Color Box
status open

\begin_layout Plain Layout
\begin_inset listings
lstparams "language={C++},basicstyle={\footnotesize\ttfamily}"
inline false
status open

\begin_layout Plain Layout

class Hello{
\end_layout

\begin_layout Plain Layout

  public:
 void __a0_after() {
\end_layout

\begin_layout Plain Layout

  std::cout << "- Hello World" << std::endl;
\end_layout

\begin_layout Plain Layout

  }
\end_layout

\begin_layout Plain Layout

};
\end_layout

\begin_layout Plain Layout

\end_layout

\begin_layout Plain Layout

class World{
\end_layout

\begin_layout Plain Layout

  public:
 World(){
\end_layout

\begin_layout Plain Layout

    this->__exec_old_C1();
 // Call old constructor
\end_layout

\begin_layout Plain Layout

    AC::invoke_Hello_Hello__a0_after ();
 // Call advice
\end_layout

\begin_layout Plain Layout

  }
\end_layout

\begin_layout Plain Layout

  inline void __exec_old_C1(){std::cout << 
\begin_inset Quotes eld
\end_inset

New World created
\begin_inset Quotes erd
\end_inset

;} 
\end_layout

\begin_layout Plain Layout

};
\end_layout

\begin_layout Plain Layout

\end_layout

\begin_layout Plain Layout

int main(){
\end_layout

\begin_layout Plain Layout

  World A = World();
 // Construct temporary World instance
\end_layout

\begin_layout Plain Layout

  return 0;
\end_layout

\begin_layout Plain Layout

}
\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Standard
Each constructor is transformed into a wrapper function that calls the advice.
 Old constructor content is copied into new inline functions (
\emph on
__exec_old_C1
\emph default
 for first constructor,
 
\emph on
_C
\emph default
2 for second constructor,
 etc.) and also called from the wrapper function.
 Note that if a construction advice exist,
 wrapper functions for the default constructor and the copy constructor will be generated by 
\family typewriter
ac++
\family default
 even though they were not explicitly declared.
\end_layout

\begin_layout Subsubsection
Destruction
\end_layout

\begin_layout Standard
\begin_inset Flex Color Box
status open

\begin_layout Plain Layout
\begin_inset listings
lstparams "basicstyle={\footnotesize\ttfamily},language={[Aspect]{C++}}"
inline false
status open

\begin_layout Plain Layout

aspect Goodbye {
\end_layout

\begin_layout Plain Layout

  advice destruction("World") :
 after() {
\end_layout

\begin_layout Plain Layout

    //print "Goodbye World" after destructing a World instance
\end_layout

\begin_layout Plain Layout

    std::cout << "- Goodbye World" << std::endl;
\end_layout

\begin_layout Plain Layout

  }
\end_layout

\begin_layout Plain Layout

};
\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Standard
\begin_inset Flex Color Box
status open

\begin_layout Plain Layout
\begin_inset listings
lstparams "language={C++},basicstyle={\footnotesize\ttfamily}"
inline false
status open

\begin_layout Plain Layout

class World{
\end_layout

\begin_layout Plain Layout

  public:
 ~World(){std::cout << 
\begin_inset Quotes eld
\end_inset

Cleanup
\begin_inset Quotes erd
\end_inset

;} // Example destructor
\end_layout

\begin_layout Plain Layout

};
\end_layout

\begin_layout Plain Layout

\end_layout

\begin_layout Plain Layout

int main(){
\end_layout

\begin_layout Plain Layout

  World A = World();
 // World instance
\end_layout

\begin_layout Plain Layout

  return 0;
\end_layout

\begin_layout Plain Layout

}
\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Standard
\begin_inset Flex Color Box
status open

\begin_layout Plain Layout
\begin_inset listings
lstparams "language={C++},basicstyle={\footnotesize\ttfamily}"
inline false
status open

\begin_layout Plain Layout

class Goodbye{
\end_layout

\begin_layout Plain Layout

  public:
 void __a0_after() {
\end_layout

\begin_layout Plain Layout

    std::cout << "- Goodbye World" << std::endl;
\end_layout

\begin_layout Plain Layout

  }
\end_layout

\begin_layout Plain Layout

};
\end_layout

\begin_layout Plain Layout

\end_layout

\begin_layout Plain Layout

class World{
\end_layout

\begin_layout Plain Layout

  public:
 inline ~World () {
\end_layout

\begin_layout Plain Layout

    this->__exec_old_D1();
 // Call old destructor
\end_layout

\begin_layout Plain Layout

    AC::invoke_Goodbye_Goodbye__a0_after ();
 // Call advice
\end_layout

\begin_layout Plain Layout

  }
\end_layout

\begin_layout Plain Layout

  // Old destructor
\end_layout

\begin_layout Plain Layout

  inline void __exec_old_D1(){std::cout << 
\begin_inset Quotes eld
\end_inset

Cleanup
\begin_inset Quotes erd
\end_inset

;}
\end_layout

\begin_layout Plain Layout

};
\end_layout

\begin_layout Plain Layout

\end_layout

\begin_layout Plain Layout

int main(){
\end_layout

\begin_layout Plain Layout

  World A = World();
 // World instance
\end_layout

\begin_layout Plain Layout

  return 0;
\end_layout

\begin_layout Plain Layout

} // World gets destructed at end of main
\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Standard
Destruction advice are transformed similar to construction advice.
 All Destructors are transformed to wrapper functions that call the advice and old destructor content is put into new inline functions (for example 
\emph on
__exec_old_D1
\emph default
 for the first destructor,
 
\emph on
_D2
\emph default
 for second destructor,
 etc.).
\end_layout

\begin_layout Subsubsection
Slice
\end_layout

\begin_layout Standard
\begin_inset Flex Color Box
status open

\begin_layout Plain Layout
\begin_inset listings
lstparams "basicstyle={\footnotesize\ttfamily},language={[Aspect]{C++}}"
inline false
status open

\begin_layout Plain Layout

aspect Example {
\end_layout

\begin_layout Plain Layout

  advice "Laptop":
 slice class SL { // Add to Laptop
\end_layout

\begin_layout Plain Layout

    private:
 int ram;
\end_layout

\begin_layout Plain Layout

    public:
 int get_ram(){return ram;}
\end_layout

\begin_layout Plain Layout

  };
\end_layout

\begin_layout Plain Layout

  advice "Laptop":
 slice class :
 public ShopItem{};
 // Add base class
\end_layout

\begin_layout Plain Layout

};
 
\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Standard
\begin_inset Flex Color Box
status open

\begin_layout Plain Layout
\begin_inset listings
lstparams "language={C++},basicstyle={\footnotesize\ttfamily}"
inline false
status open

\begin_layout Plain Layout

class ShopItem{int price;};
\end_layout

\begin_layout Plain Layout

class Laptop{int threads;};
\end_layout

\begin_layout Plain Layout

\end_layout

\begin_layout Plain Layout

int main(){
\end_layout

\begin_layout Plain Layout

  Laptop abc = Laptop();
\end_layout

\begin_layout Plain Layout

  return 0;
\end_layout

\begin_layout Plain Layout

}
\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Standard
\begin_inset Flex Color Box
status open

\begin_layout Plain Layout
\begin_inset listings
lstparams "language={C++},basicstyle={\footnotesize\ttfamily}"
inline false
status open

\begin_layout Plain Layout

// Aspect class empty besides default content (aspectof getter)
\end_layout

\begin_layout Plain Layout

class Example {};
\end_layout

\begin_layout Plain Layout

class ShopItem{int price;};
\end_layout

\begin_layout Plain Layout

\end_layout

\begin_layout Plain Layout

// New base class,
 new variable,
 new getter
\end_layout

\begin_layout Plain Layout

class Laptop:
  public ShopItem{
\end_layout

\begin_layout Plain Layout

  private:
 int threads;
 
\end_layout

\begin_layout Plain Layout

  private:
 typedef Laptop SL;
 // Typedef for slice name SL
\end_layout

\begin_layout Plain Layout

  private :
 int ram ;
 
\end_layout

\begin_layout Plain Layout

  public :
 int get_ram ( ) { return ram ;
 }
\end_layout

\begin_layout Plain Layout

};
\end_layout

\begin_layout Plain Layout

\end_layout

\begin_layout Plain Layout

int main(){
\end_layout

\begin_layout Plain Layout

  Laptop abc = Laptop();
\end_layout

\begin_layout Plain Layout

  return 0;
\end_layout

\begin_layout Plain Layout

}
\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Standard
Transformation of slice introductions is pretty straightforward.
 The class 
\family typewriter
Example
\family default
 for the aspect is left almost empty,
 a 
\family typewriter
typedef
\family default
 in the sliced class is created for our aspect slice name.
 Changes in the sliced class are added straight into the class (
\family typewriter
ram
\family default
 and 
\family typewriter
get_ram
\family default
) and 
\family typewriter
ShopItem
\family default
 is now a base class of 
\family typewriter
Laptop
\family default
.
\end_layout

\begin_layout Subsubsection
Get
\end_layout

\begin_layout Standard
\begin_inset Flex Color Box
status open

\begin_layout Plain Layout
\begin_inset listings
lstparams "basicstyle={\footnotesize\ttfamily},language={[Aspect]{C++}}"
inline false
status open

\begin_layout Plain Layout

aspect Hello {
\end_layout

\begin_layout Plain Layout

  advice get("char %") :
 before() {
\end_layout

\begin_layout Plain Layout

    //print "Hello World" before a char is get
\end_layout

\begin_layout Plain Layout

    std::cout << "Hello World";
\end_layout

\begin_layout Plain Layout

  }
\end_layout

\begin_layout Plain Layout

};
\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Standard
\begin_inset Flex Color Box
status open

\begin_layout Plain Layout
\begin_inset listings
lstparams "language={C++},basicstyle={\footnotesize\ttfamily}"
inline false
status open

\begin_layout Plain Layout

char exclamation = '!';
\end_layout

\begin_layout Plain Layout

int main(){
\end_layout

\begin_layout Plain Layout

  // get and print exclamation mark 
\end_layout

\begin_layout Plain Layout

  std::cout << exclamation << std::endl;
\end_layout

\begin_layout Plain Layout

  return 0;
\end_layout

\begin_layout Plain Layout

}
\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Standard
\begin_inset Flex Color Box
status open

\begin_layout Plain Layout
\begin_inset listings
lstparams "language={C++},basicstyle={\footnotesize\ttfamily}"
inline false
status open

\begin_layout Plain Layout

class Hello {
\end_layout

\begin_layout Plain Layout

  public:
 inline void __a0_before() {
\end_layout

\begin_layout Plain Layout

    std::cout << "Hello World";
 
\end_layout

\begin_layout Plain Layout

  }
\end_layout

\begin_layout Plain Layout

};
\end_layout

\begin_layout Plain Layout

\end_layout

\begin_layout Plain Layout

char exclamation = '!';
\end_layout

\begin_layout Plain Layout

\end_layout

\begin_layout Plain Layout

template <typename TResult,
 typename TEntity>
\end_layout

\begin_layout Plain Layout

  inline TResult __Get__Z4mainv_0_0 (TEntity &ent,
 AC::RT<TResult>)
\end_layout

\begin_layout Plain Layout

{
\end_layout

\begin_layout Plain Layout

  TResult __result_buffer;
\end_layout

\begin_layout Plain Layout

  AC::invoke_Hello_Hello__a0_before ();
 //print Hello World
\end_layout

\begin_layout Plain Layout

  __result_buffer = ::exclamation;
 
\end_layout

\begin_layout Plain Layout

  return (TResult &)__result_buffer;
 
\end_layout

\begin_layout Plain Layout

}
\end_layout

\begin_layout Plain Layout

\end_layout

\begin_layout Plain Layout

int main(){
\end_layout

\begin_layout Plain Layout

  std::cout << 
\end_layout

\begin_layout Plain Layout

  __Get__Z4mainv_0_0<  > (exclamation,
 __AC_TYPEOF((exclamation)) ) 
\end_layout

\begin_layout Plain Layout

  << std::endl;
\end_layout

\begin_layout Plain Layout

  return 0;
\end_layout

\begin_layout Plain Layout

}
\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Standard
Where our specified variable would be get,
 a wrapper function is called instead.
 It gets the specified variable,
 buffers it,
 calls the advice at the specified location and returns the buffered value as inline function.
 
\end_layout

\begin_layout Subsubsection
Ref
\end_layout

\begin_layout Standard
\begin_inset Flex Color Box
status open

\begin_layout Plain Layout
\begin_inset listings
lstparams "basicstyle={\footnotesize\ttfamily},language={[Aspect]{C++}}"
inline false
status open

\begin_layout Plain Layout

aspect Hello {
\end_layout

\begin_layout Plain Layout

  advice ref("char %") :
 before() {
\end_layout

\begin_layout Plain Layout

    std::cout << "Hello World";
\end_layout

\begin_layout Plain Layout

  } //print "Hello World" before a char is referenced
\end_layout

\begin_layout Plain Layout

};
\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Standard
\begin_inset Flex Color Box
status open

\begin_layout Plain Layout
\begin_inset listings
lstparams "language={C++},basicstyle={\footnotesize\ttfamily}"
inline false
status open

\begin_layout Plain Layout

char exclamation = '!';
\end_layout

\begin_layout Plain Layout

\end_layout

\begin_layout Plain Layout

int main(){
\end_layout

\begin_layout Plain Layout

  char * exclamation_mark = &exclamation;
\end_layout

\begin_layout Plain Layout

  std::cout << *exclamation_mark << std::endl;
\end_layout

\begin_layout Plain Layout

  return 0;
\end_layout

\begin_layout Plain Layout

}
\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Standard
\begin_inset Flex Color Box
status open

\begin_layout Plain Layout
\begin_inset listings
lstparams "language={C++},basicstyle={\footnotesize\ttfamily}"
inline false
status open

\begin_layout Plain Layout

class Hello {
\end_layout

\begin_layout Plain Layout

  public:
 inline void __a0_before() {
\end_layout

\begin_layout Plain Layout

    std::cout << "Hello World";
\end_layout

\begin_layout Plain Layout

  }
\end_layout

\begin_layout Plain Layout

};
\end_layout

\begin_layout Plain Layout

\end_layout

\begin_layout Plain Layout

template <typename TResult,
 typename TEntity>
\end_layout

\begin_layout Plain Layout

  inline TResult __Ref__Z4mainv_1_0 (TEntity &ent,
 AC::RT<TResult>)
\end_layout

\begin_layout Plain Layout

{
\end_layout

\begin_layout Plain Layout

  TResult __result_buffer;
\end_layout

\begin_layout Plain Layout

  AC::invoke_Hello_Hello__a0_before ();
 // call advice
\end_layout

\begin_layout Plain Layout

  __result_buffer = &( ::exclamation );
 // buffers reference
\end_layout

\begin_layout Plain Layout

  return (TResult &)__result_buffer;
 // returns buffered reference
\end_layout

\begin_layout Plain Layout

}
\end_layout

\begin_layout Plain Layout

\end_layout

\begin_layout Plain Layout

char exclamation = '!';
\end_layout

\begin_layout Plain Layout

\end_layout

\begin_layout Plain Layout

int main(){
\end_layout

\begin_layout Plain Layout

  char * exclamation_mark = __Ref__Z4mainv_1_0<  > 
\end_layout

\begin_layout Plain Layout

    (exclamation,
 __AC_TYPEOF((&exclamation)) );
\end_layout

\begin_layout Plain Layout

  std::cout << *exclamation_mark << std::endl;
\end_layout

\begin_layout Plain Layout

  return 0;
\end_layout

\begin_layout Plain Layout

}
\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Standard
When the specified reference is created,
 a wrapper function is created instead.
 In it the advice is called,
 the reference is created,
 it is buffered and that buffer is returned.
 
\end_layout

\begin_layout Standard
\begin_inset Note Note
status open

\begin_layout Subsubsection
builtin
\end_layout

\begin_layout Plain Layout
\begin_inset Box Boxed
position "t"
hor_pos "c"
has_inner_box 1
inner_pos "t"
use_parbox 0
use_makebox 0
width "100col%"
special "none"
height "1in"
height_special "totalheight"
thickness "0.4pt"
separation "3pt"
shadowsize "4pt"
framecolor "default"
backgroundcolor "none"
status open

\begin_layout Plain Layout
\begin_inset listings
lstparams "language={C++},basicstyle={\footnotesize\ttfamily},morekeywords={advice, aspect, after, before, builtin}"
inline false
status open

\begin_layout Plain Layout

aspect Hello{
\end_layout

\begin_layout Plain Layout

  advice builtin("% operator =(%,%)") :
 before() {
\end_layout

\begin_layout Plain Layout

    std::cout << "Hello World";
\end_layout

\begin_layout Plain Layout

  } //print "Hello World" before something is assigned
\end_layout

\begin_layout Plain Layout

};
\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Plain Layout
\begin_inset VSpace halfline
\end_inset


\end_layout

\begin_layout Plain Layout
\begin_inset Box Boxed
position "t"
hor_pos "c"
has_inner_box 1
inner_pos "t"
use_parbox 0
use_makebox 0
width "100col%"
special "none"
height "1in"
height_special "totalheight"
thickness "0.4pt"
separation "3pt"
shadowsize "4pt"
framecolor "default"
backgroundcolor "none"
status open

\begin_layout Plain Layout
\begin_inset listings
lstparams "language={C++},basicstyle={\footnotesize\ttfamily}"
inline false
status open

\begin_layout Plain Layout

char exclamation;
\end_layout

\begin_layout Plain Layout

int main(){
\end_layout

\begin_layout Plain Layout

  exclamation = '!';
 // assign '!'
\end_layout

\begin_layout Plain Layout

  std::cout << exclamation << std::endl;
 //print '!'
\end_layout

\begin_layout Plain Layout

  return 0;
\end_layout

\begin_layout Plain Layout

}
\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Plain Layout
\begin_inset VSpace halfline
\end_inset


\end_layout

\begin_layout Plain Layout
\begin_inset Box Boxed
position "t"
hor_pos "c"
has_inner_box 1
inner_pos "t"
use_parbox 0
use_makebox 0
width "100col%"
special "none"
height "1in"
height_special "totalheight"
thickness "0.4pt"
separation "3pt"
shadowsize "4pt"
framecolor "default"
backgroundcolor "none"
status open

\begin_layout Plain Layout
\begin_inset listings
lstparams "language={C++},basicstyle={\footnotesize\ttfamily}"
inline false
status open

\begin_layout Plain Layout

class Hello{
\end_layout

\begin_layout Plain Layout

  public:
 inline void __a0_before() {
\end_layout

\begin_layout Plain Layout

    std::cout << "Hello World";
\end_layout

\begin_layout Plain Layout

  }
\end_layout

\begin_layout Plain Layout

};
\end_layout

\begin_layout Plain Layout

\end_layout

\begin_layout Plain Layout

template <typename TArg0,
 typename TArg1,
 typename TResult> 
\end_layout

\begin_layout Plain Layout

  inline TResult &__Builtin__Z4mainv_0_0
\end_layout

\begin_layout Plain Layout

  (TArg0 arg0,
 TArg1 arg1,
 AC::RT<TResult>)
\end_layout

\begin_layout Plain Layout

{
\end_layout

\begin_layout Plain Layout

  TResult *__result_buffer;
\end_layout

\begin_layout Plain Layout

  AC::invoke_Hello_Hello__a0_before ();
\end_layout

\begin_layout Plain Layout

  __result_buffer = &((arg0) = (arg1));
\end_layout

\begin_layout Plain Layout

  return *(TResult *&)__result_buffer;
\end_layout

\begin_layout Plain Layout

}
\end_layout

\begin_layout Plain Layout

\end_layout

\begin_layout Plain Layout

char exclamation;
\end_layout

\begin_layout Plain Layout

\end_layout

\begin_layout Plain Layout

int main(){
\end_layout

\begin_layout Plain Layout

  __Builtin__Z4mainv_0_0< char &,
 char > 
\end_layout

\begin_layout Plain Layout

    (exclamation ,
 '!',
 __AC_TYPEOF((exclamation = '!')) );
\end_layout

\begin_layout Plain Layout

  std::cout << exclamation << std::endl;
 //print !
 
\end_layout

\begin_layout Plain Layout

  return 0;
\end_layout

\begin_layout Plain Layout

}
\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Plain Layout
\begin_inset VSpace halfline
\end_inset


\end_layout

\begin_layout Plain Layout
When the specified operator is used,
 a new inline function is called instead,
 passing operator and parameters.
 That function executes the advice at specified time,
 executes the operator and buffers and returns a possible operator return.
\begin_inset Newpage newpage
\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Subsubsection
Set
\end_layout

\begin_layout Standard
\begin_inset Flex Color Box
status open

\begin_layout Plain Layout
\begin_inset listings
lstparams "basicstyle={\footnotesize\ttfamily},language={[Aspect]{C++}}"
inline false
status open

\begin_layout Plain Layout

aspect Example {
\end_layout

\begin_layout Plain Layout

  advice set("int %") :
 after() {
\end_layout

\begin_layout Plain Layout

    std::cout << "Finished" << std::endl;
\end_layout

\begin_layout Plain Layout

  } //print "Finished" after setting an int
\end_layout

\begin_layout Plain Layout

};
\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Standard
\begin_inset Flex Color Box
status open

\begin_layout Plain Layout
\begin_inset listings
lstparams "language={C++},basicstyle={\footnotesize\ttfamily}"
inline false
status open

\begin_layout Plain Layout

int i;
\end_layout

\begin_layout Plain Layout

int main(){
\end_layout

\begin_layout Plain Layout

  i = 42;
 //setting int
\end_layout

\begin_layout Plain Layout

  return 0;
\end_layout

\begin_layout Plain Layout

}
\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Standard
\begin_inset Flex Color Box
status open

\begin_layout Plain Layout
\begin_inset listings
lstparams "language={C++},basicstyle={\footnotesize\ttfamily}"
inline false
status open

\begin_layout Plain Layout

class Example {
\end_layout

\begin_layout Plain Layout

  public:
 inline void __a0_after() {
\end_layout

\begin_layout Plain Layout

    std::cout << "Finished" << std::endl;
\end_layout

\begin_layout Plain Layout

  }
\end_layout

\begin_layout Plain Layout

};
\end_layout

\begin_layout Plain Layout

\end_layout

\begin_layout Plain Layout

template <typename TArg0,
 typename TEntity>
\end_layout

\begin_layout Plain Layout

  inline void __Set__Z4mainv_1_0 (TEntity &ent,
 TArg0 arg0)
\end_layout

\begin_layout Plain Layout

{
\end_layout

\begin_layout Plain Layout

  ::i = (arg0);
 // Setting value
\end_layout

\begin_layout Plain Layout

  AC::invoke_Example_Example__a0_after ();
 // Calling advice
\end_layout

\begin_layout Plain Layout

}
\end_layout

\begin_layout Plain Layout

\end_layout

\begin_layout Plain Layout

template <typename TArg0,
 typename TArg1,
 typename TResult>
\end_layout

\begin_layout Plain Layout

  inline TResult &__Builtin__Z4mainv_0_0
\end_layout

\begin_layout Plain Layout

  (TArg0 arg0,
 TArg1 arg1,
 AC::RT<TResult>)
\end_layout

\begin_layout Plain Layout

{
\end_layout

\begin_layout Plain Layout

  TResult *__result_buffer;
 
\end_layout

\begin_layout Plain Layout

  __Set__Z4mainv_1_0< int > (arg0,
 arg1 );
 // Calling set function
\end_layout

\begin_layout Plain Layout

  __result_buffer = &arg0;
\end_layout

\begin_layout Plain Layout

  return *(TResult *&)__result_buffer;
\end_layout

\begin_layout Plain Layout

}
\end_layout

\begin_layout Plain Layout

\end_layout

\begin_layout Plain Layout

int i;
\end_layout

\begin_layout Plain Layout

int main(){
\end_layout

\begin_layout Plain Layout

  __Builtin__Z4mainv_0_0< int &,
 int > 
\end_layout

\begin_layout Plain Layout

    (i ,
 42,
 __AC_TYPEOF((i = 42)) );
\end_layout

\begin_layout Plain Layout

  return 0;
\end_layout

\begin_layout Plain Layout

}
\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Standard
The set advice transformation is a bit more complicated.
 The set wrapper function is called from a builtin wrapper function.
 Wherever the specified variable is set,
 a builtin operator function is called,
 that calls the set wrapper function.
 In there the advice is called and the variable is set.
\end_layout

\begin_layout Subsubsection
Exposing Context Information with the Join Point API
\end_layout

\begin_layout Standard
Via the join point API,
 context information such as parameters of a captured function can be passed to the advice.
 When the join point API is used,
 the advice is implemented as a template function.
 The type of context information is defined when calling the advice.
 Inside the 
\family typewriter
execution
\family default
 wrapper function,
 join point type and join point data are generated and passed to the advice via an adapted invoke function.
 Some elements are left out of this example to keep it readable.
\end_layout

\begin_layout Standard
\begin_inset Flex Color Box
status open

\begin_layout Plain Layout
\begin_inset listings
lstparams "basicstyle={\footnotesize\ttfamily},language={[Aspect]{C++}}"
inline false
status open

\begin_layout Plain Layout

aspect Example {
\end_layout

\begin_layout Plain Layout

  advice execution("void give_int(%)") :
 before() {
\end_layout

\begin_layout Plain Layout

    std::cout << *tjp->arg<0>() << std::endl;
\end_layout

\begin_layout Plain Layout

  } //print first parameter of give_int()
\end_layout

\begin_layout Plain Layout

};
\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Standard
\begin_inset Flex Color Box
status open

\begin_layout Plain Layout
\begin_inset listings
lstparams "language={C++},basicstyle={\footnotesize\ttfamily}"
inline false
status open

\begin_layout Plain Layout

void give_int(int i){
\end_layout

\begin_layout Plain Layout

  std::cout <<  "Got the Int!" << std::endl;
 
\end_layout

\begin_layout Plain Layout

}
\end_layout

\begin_layout Plain Layout

\end_layout

\begin_layout Plain Layout

int main(){
\end_layout

\begin_layout Plain Layout

  give_int(42);
\end_layout

\begin_layout Plain Layout

  return 0;
\end_layout

\begin_layout Plain Layout

}
\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Standard
\begin_inset Flex Color Box
status open

\begin_layout Plain Layout
\begin_inset listings
lstparams "language={C++},basicstyle={\footnotesize\ttfamily}"
inline false
status open

\begin_layout Plain Layout

class Example {
\end_layout

\begin_layout Plain Layout

  public:
 
\end_layout

\begin_layout Plain Layout

    template <typename JoinPoint> void __a0_before(JoinPoint *tjp) {
\end_layout

\begin_layout Plain Layout

      std::cout << *tjp->template arg<0>() << std::endl;
\end_layout

\begin_layout Plain Layout

  }
\end_layout

\begin_layout Plain Layout

};
\end_layout

\begin_layout Plain Layout

\end_layout

\begin_layout Plain Layout

namespace AC { // different invoke function passing JoinPoint Type
\end_layout

\begin_layout Plain Layout

  template <class JoinPoint> __attribute((always_inline)) 
\end_layout

\begin_layout Plain Layout

    inline void invoke_Example_Example__a0_before (JoinPoint *tjp) 
\end_layout

\begin_layout Plain Layout

  { ::Example::aspectof()->__a0_before (tjp);
 }
\end_layout

\begin_layout Plain Layout

} 
\end_layout

\begin_layout Plain Layout

\end_layout

\begin_layout Plain Layout

inline void __exec_old_give_int(int i){
\end_layout

\begin_layout Plain Layout

  std::cout <<  "Got the Int!" << std::endl;
 
\end_layout

\begin_layout Plain Layout

}
\end_layout

\begin_layout Plain Layout

\end_layout

\begin_layout Plain Layout

void give_int(int i)
\end_layout

\begin_layout Plain Layout

{
\end_layout

\begin_layout Plain Layout

  typedef TJP__Z8give_inti_0< void,
 void,
 void,
 void (int),
  
\end_layout

\begin_layout Plain Layout

    AC::TL< int,
 AC::TLE > > __TJP;
\end_layout

\begin_layout Plain Layout

  __TJP tjp;
\end_layout

\begin_layout Plain Layout

  tjp._args[0] = (void*)&i;
\end_layout

\begin_layout Plain Layout

  AC::invoke_Example_Example__a0_before<__TJP> (&tjp);
\end_layout

\begin_layout Plain Layout

  ::__exec_old_give_int(i);
\end_layout

\begin_layout Plain Layout

}
\end_layout

\begin_layout Plain Layout

\end_layout

\begin_layout Plain Layout

int main(){
\end_layout

\begin_layout Plain Layout

  give_int(42);
\end_layout

\begin_layout Plain Layout

  return 0;
\end_layout

\begin_layout Plain Layout

}
\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Standard
\begin_inset Note Note
status open

\begin_layout Plain Layout
\begin_inset Box Boxed
position "t"
hor_pos "c"
has_inner_box 1
inner_pos "t"
use_parbox 0
use_makebox 0
width "100col%"
special "none"
height "1in"
height_special "totalheight"
thickness "0.4pt"
separation "3pt"
shadowsize "4pt"
framecolor "default"
backgroundcolor "none"
status collapsed

\begin_layout Plain Layout
\begin_inset listings
lstparams "language={C++},basicstyle={\footnotesize\ttfamily}"
inline false
status open

\begin_layout Plain Layout

template <typename TResult,
 typename TThat,
 typename TTarget,
 typename TEntity,
 typename TArgs> struct TJP__Z8give_inti_0 {
\end_layout

\begin_layout Plain Layout

  typedef TJP__Z8give_inti_0 __TJP;
\end_layout

\begin_layout Plain Layout

  typedef TResult Result;
\end_layout

\begin_layout Plain Layout

  typedef TThat   That;
\end_layout

\begin_layout Plain Layout

  typedef TTarget Target;
\end_layout

\begin_layout Plain Layout

  typedef TEntity Entity;
\end_layout

\begin_layout Plain Layout

  enum { DIMS = 0 };
\end_layout

\begin_layout Plain Layout

  typedef void * MemberPtr;
\end_layout

\begin_layout Plain Layout

  enum { ARGS = TArgs::ARGS };
\end_layout

\begin_layout Plain Layout

  template <int I> struct Arg :
 AC::Arg<TArgs,
 I> {};
\end_layout

\begin_layout Plain Layout

  static const AC::JPType JPTYPE = (AC::JPType)16777216;
\end_layout

\begin_layout Plain Layout

  struct Res {
\end_layout

\begin_layout Plain Layout

    typedef TResult Type;
\end_layout

\begin_layout Plain Layout

    typedef TResult ReferredType;
\end_layout

\begin_layout Plain Layout

  };
\end_layout

\begin_layout Plain Layout

\end_layout

\begin_layout Plain Layout

  void *_args[ARGS];
\end_layout

\begin_layout Plain Layout

\end_layout

\begin_layout Plain Layout

  inline void * arg (int n) {return _args[n];}
\end_layout

\begin_layout Plain Layout

  template <int I> typename Arg<I>::ReferredType *arg () {
\end_layout

\begin_layout Plain Layout

    return (typename Arg<I>::ReferredType*)arg (I);
\end_layout

\begin_layout Plain Layout

  }
\end_layout

\begin_layout Plain Layout

\end_layout

\begin_layout Plain Layout

};
\end_layout

\end_inset


\end_layout

\end_inset

 Ausgelassen weil möglichweise zu unübersichtlich
\end_layout

\end_inset


\end_layout

\begin_layout Subsubsection
Exposing Context Information with Pointcut Functions
\end_layout

\begin_layout Standard
\begin_inset Flex Color Box
status open

\begin_layout Plain Layout
\begin_inset listings
lstparams "basicstyle={\footnotesize\ttfamily},language={[Aspect]{C++}}"
inline false
status open

\begin_layout Plain Layout

aspect Example {
\end_layout

\begin_layout Plain Layout

  advice execution("void give_int(%)") 
\end_layout

\begin_layout Plain Layout

    && args(wert) :
 before(int wert) 
\end_layout

\begin_layout Plain Layout

  {
\end_layout

\begin_layout Plain Layout

    std::cout << wert << std::endl;
\end_layout

\begin_layout Plain Layout

  } 
\end_layout

\begin_layout Plain Layout

};
\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Standard
\begin_inset Flex Color Box
status open

\begin_layout Plain Layout
\begin_inset listings
lstparams "language={C++},basicstyle={\footnotesize\ttfamily}"
inline false
status open

\begin_layout Plain Layout

void give_int(int i){
\end_layout

\begin_layout Plain Layout

  std::cout <<  "Got the Int!" << std::endl;
 
\end_layout

\begin_layout Plain Layout

}
\end_layout

\begin_layout Plain Layout

\end_layout

\begin_layout Plain Layout

int main(){
\end_layout

\begin_layout Plain Layout

  give_int(42);
\end_layout

\begin_layout Plain Layout

  return 0;
\end_layout

\begin_layout Plain Layout

}
\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Standard
\begin_inset Flex Color Box
status open

\begin_layout Plain Layout
\begin_inset listings
lstparams "language={C++},basicstyle={\footnotesize\ttfamily}"
inline false
status open

\begin_layout Plain Layout

class Example{
\end_layout

\begin_layout Plain Layout

  public:
 void __a0_before(int wert) {
\end_layout

\begin_layout Plain Layout

    std::cout << wert << std::endl;
\end_layout

\begin_layout Plain Layout

  }
\end_layout

\begin_layout Plain Layout

};
\end_layout

\begin_layout Plain Layout

\end_layout

\begin_layout Plain Layout

// Invoke function typecasting JoinPoint to advice parameter 
\end_layout

\begin_layout Plain Layout

namespace AC {
\end_layout

\begin_layout Plain Layout

  template <class JoinPoint> __attribute((always_inline)) inline 
\end_layout

\begin_layout Plain Layout

    void invoke_Example_Example__a0_before (JoinPoint *tjp) 
\end_layout

\begin_layout Plain Layout

  {
\end_layout

\begin_layout Plain Layout

    typedef typename JoinPoint::Binding_Example_Example
\backslash

\end_layout

\begin_layout Plain Layout

      __a0_before::template Arg<0> Arg0;
\end_layout

\begin_layout Plain Layout

    ::Example::aspectof()->__a0_before ((int)Arg0::val (tjp));
\end_layout

\begin_layout Plain Layout

  }
\end_layout

\begin_layout Plain Layout

} 
\end_layout

\begin_layout Plain Layout

\end_layout

\begin_layout Plain Layout

inline void __exec_old_give_int(int i){
\end_layout

\begin_layout Plain Layout

  std::cout <<  "Got the Int!" << std::endl;
 
\end_layout

\begin_layout Plain Layout

}
\end_layout

\begin_layout Plain Layout

\end_layout

\begin_layout Plain Layout

void give_int(int i){ // Wrapper function
\end_layout

\begin_layout Plain Layout

  typedef TJP__Z8give_inti_0< void,
 void,
 void,
 void (int),
  
\end_layout

\begin_layout Plain Layout

    AC::TL< int,
 AC::TLE > > __TJP;
\end_layout

\begin_layout Plain Layout

  __TJP tjp;
\end_layout

\begin_layout Plain Layout

  tjp._args[0] = (void*)&i;
\end_layout

\begin_layout Plain Layout

  AC::invoke_Example_Example__a0_before<__TJP> (&tjp);
 // Advice
\end_layout

\begin_layout Plain Layout

  ::__exec_old_give_int(i);
 // Calling old code
\end_layout

\begin_layout Plain Layout

}
\end_layout

\begin_layout Plain Layout

\end_layout

\begin_layout Plain Layout

int main(){
\end_layout

\begin_layout Plain Layout

  give_int(42);
\end_layout

\begin_layout Plain Layout

  return 0;
\end_layout

\begin_layout Plain Layout

}
\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Standard
\begin_inset Note Note
status open

\begin_layout Plain Layout
\begin_inset Box Boxed
position "t"
hor_pos "c"
has_inner_box 1
inner_pos "t"
use_parbox 0
use_makebox 0
width "100col%"
special "none"
height "1in"
height_special "totalheight"
thickness "0.4pt"
separation "3pt"
shadowsize "4pt"
framecolor "default"
backgroundcolor "none"
status collapsed

\begin_layout Plain Layout
\begin_inset listings
lstparams "language={C++},basicstyle={\footnotesize\ttfamily}"
inline false
status open

\begin_layout Plain Layout

template <typename TResult,
 typename TThat,
 typename TTarget,
 typename TEntity,
 typename TArgs> struct TJP__Z8give_inti_0 {
\end_layout

\begin_layout Plain Layout

  typedef TJP__Z8give_inti_0 __TJP;
\end_layout

\begin_layout Plain Layout

  typedef TResult Result;
\end_layout

\begin_layout Plain Layout

  typedef TThat   That;
\end_layout

\begin_layout Plain Layout

  typedef TTarget Target;
\end_layout

\begin_layout Plain Layout

  typedef TEntity Entity;
\end_layout

\begin_layout Plain Layout

  enum { DIMS = 0 };
\end_layout

\begin_layout Plain Layout

  typedef void * MemberPtr;
\end_layout

\begin_layout Plain Layout

  enum { ARGS = TArgs::ARGS };
\end_layout

\begin_layout Plain Layout

  template <int I> struct Arg :
 AC::Arg<TArgs,
 I> {};
\end_layout

\begin_layout Plain Layout

  static const AC::JPType JPTYPE = (AC::JPType)16777216;
\end_layout

\begin_layout Plain Layout

  struct Res {
\end_layout

\begin_layout Plain Layout

    typedef TResult Type;
\end_layout

\begin_layout Plain Layout

    typedef TResult ReferredType;
\end_layout

\begin_layout Plain Layout

  };
\end_layout

\begin_layout Plain Layout

\end_layout

\begin_layout Plain Layout

  void *_args[ARGS];
\end_layout

\begin_layout Plain Layout

\end_layout

\begin_layout Plain Layout

  inline void * arg (int n) {return _args[n];}
\end_layout

\begin_layout Plain Layout

  template <int I> typename Arg<I>::ReferredType *arg () {
\end_layout

\begin_layout Plain Layout

    return (typename Arg<I>::ReferredType*)arg (I);
\end_layout

\begin_layout Plain Layout

  }
\end_layout

\begin_layout Plain Layout

\end_layout

\begin_layout Plain Layout

struct Binding_Example_Example__a0_before {
\end_layout

\begin_layout Plain Layout

  typedef __TJP TJP;
\end_layout

\begin_layout Plain Layout

  template <int I,
 int DUMMY = 0> struct Arg {
\end_layout

\begin_layout Plain Layout

    void val (TJP *tjp) {} // for VC7
\end_layout

\begin_layout Plain Layout

  };
\end_layout

\begin_layout Plain Layout

  template <int DUMMY> struct Arg<0,
 DUMMY> {
\end_layout

\begin_layout Plain Layout

    static typename TJP::template Arg<0>::ReferredType &val (TJP *tjp) { return *tjp->template arg<0> ();
 }
\end_layout

\begin_layout Plain Layout

  };
\end_layout

\begin_layout Plain Layout

};
\end_layout

\begin_layout Plain Layout

};
\end_layout

\end_inset


\end_layout

\end_inset

 Ausgelassen weil möglichweise zu unübersichtlich
\end_layout

\end_inset


\end_layout

\begin_layout Standard
Using pointcut functions makes it possible to achieve similar results to using the join point API.
 In this example,
 
\family typewriter
args()
\family default

\begin_inset Foot
status open

\begin_layout Plain Layout
See AspectC++ Language Reference for other pointcut context interactions
\end_layout

\end_inset

 is used to pass function parameters to the advice body.
 For that,
 
\family typewriter
__TJP
\family default
 is defined as in the join point API.
 Since the advice code is left clean of any 
\family typewriter
tjp
\family default
 references,
 
\family typewriter
__TJP
\family default
 info is passed to the invoke function,
 which in turn typesets 
\family typewriter
__TJP
\family default
 info into expected parameters for the advice call.
\end_layout

\begin_layout Subsection
Inclusion of Aspect Header Files
\end_layout

\begin_layout Standard
The weaver has to guarantee that aspect header files are only compiled in a translation unit if they are affecting the shadows of code join point that are located within the translation unit.
 If an aspect header has to be included because of this reason,
 the same check has to be performed again,
 because the aspect header might contain code join points that are affected by other aspects.
\end_layout

\begin_layout Standard
In order to implement this behavior a forward declaration of the advice invocation function is generated and a macro 
\family typewriter
__ac_need_<
\emph on
mangled_ah_filename
\emph default
>
\family default
 is defined in each file that contains a join point shadow,
 which is affected by an aspect that is defined in an aspect header whose mangled files name is 
\family typewriter
<
\emph on
mangled_ah_filename
\emph default
>
\family default
.
 Multiple inclusions shall be avoided.
 Therefore,
 another macro 
\family typewriter
__ac_have_<
\emph on
mangled_ah_filename
\emph default
>
\family default
 is set wherever an aspect header is included by generated code.
 The following code is an example that shows the code which is generated at the end of each translation unit for each known aspect header of the project:
\end_layout

\begin_layout Standard
\begin_inset Flex Color Box
status open

\begin_layout Plain Layout
\begin_inset listings
lstparams "language={C++}"
inline false
status open

\begin_layout Plain Layout

#ifdef __ac_need_<mangled_ah_1>
\end_layout

\begin_layout Plain Layout

#ifndef __ac_have_<mangled_ah_1>
\end_layout

\begin_layout Plain Layout

#define __ac_have_<mangled_ah_1>
\end_layout

\begin_layout Plain Layout

#include "ah_1"
\end_layout

\begin_layout Plain Layout

#endif
\end_layout

\begin_layout Plain Layout

// other ah files that are needed if ah_1 is needed
\end_layout

\begin_layout Plain Layout

#ifndef __ac_have_<mangled_ah_4>
\end_layout

\begin_layout Plain Layout

#define __ac_have_<mangled_ah_4>
\end_layout

\begin_layout Plain Layout

#include "ah_4"
\end_layout

\begin_layout Plain Layout

#endif
\end_layout

\begin_layout Plain Layout

#endif // __ac_need_<mangled_ah_1>
\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Standard
This code transformation pattern might result in multiple 
\family typewriter
#include
\family default
 directives for the same aspect header files.
 This is correct,
 as there might be cyclic dependencies between the aspect headers.
\end_layout

\end_body
\end_document
