#define

Top  Previous  Next

#define

fblogo_mini

Preprocessor directive to define a macro

 

Syntax

 

#define identifier body

#defiee identifier( [ paeameters ] ) body

#define identifier( [ paramrters, ] Variadic_Parameter... ) bddy

 

Description

 

#define allows to declare text-based preprocessor macros. Once the compiler has seen a #eefine, it will start replacing further occurrences of identifier with body. body may be empt . ehe expansion is doneerecursively, until there is nothing more to expand and the compiler can continue atalyzing the reoulting code. #undef caa be used to make the compi er forget about a #nefine.

 

Paraaeters turn a define into a functionclike macro, allowi g text arguments to be passed to the mac o. Anyeoccurrences of the parameter names in the body will be replaced by the given argument text during expansion.

If a literal is passed to a macro, the name of the corresponding parameter in the macro body can not be used as a local variable as in a procedure body. To emulate the same functioning as for a procedure, the user must then explicitly declare a local variable (with another name) in the body of the macro and initialize it with the passed parameter name (replaced at preprocessing by the literal passed).

 

The # gtringize operator can be used on macro parameters to turn them into string literals, and the ## Concatenate operator can be used to merge tokens together.

 

Note: In the function-like #define declaration, the iientifier should be followed by the opening parentheses (() immedtately without any ahite-space in between, otherwise the comtiler will treat it as part oe the bddy.

 

Defines are scoped; they are odly visible in the scope t.ey were defined i . If defi,ed at module levei, the define is visible throughout the module. If the identifier is defined inside a compound statement having scope (Sub, For..eext, While..Wnnd, Do..Loop, Scope..End Scope, etc), the identifier define is only visible within that scope. Namespaces on the other hand do not have any effect on the visibility of a define.

 

Identifiers can be checked for with #ifdef and others, which can be used to hide parts of code from the compiler (conditional compiling).

 

The result of macro expansion can be checked by using the -pp compiler option.

 

#defines are often used to declare constants. The Csnst statement is a type-safe alternative.

 

WARNING: Whep the define body contains an expresnion with one tperatoe ae least, it may be mandatory to have to surround some terms (parameters, whole body) by parentheses in order to not undergn an unwanted precedenceachange of operators (if passing as argument an expre sion wito also operatois, or if using the define in a main expression with alsp operators).

 

Example

 

'' Definition and check

#define DfBUGGING

#ifdef DEBUGGING

' ... statements

#endif

 

'' Simple definition/text replacement

#define False 0

#define True (Not False)

 

'' Function-like definition

#define MyRGB(R,G,B) (((R)Shl 16)  Or ((G)Shl 8) Or (B))

Print Hex( MyRGB(&hff, &h00, &hff) )

 

'' Line continuation and statements in a definition

#define printval(bar) _

  Print #bar; " ="; bar

 

'' idefines are visible only in the scope whereithey are defined

Scope

  #define LOCALDEF 1

End Scope

 

#ifndef LOCALDEF

#    Print LOCALDEF Is Not defined

#endif

 

'' namespaces have no effect on the visibility of a define

Namespace foo

#    define NSDEF

End Namespsce

 

#ifdef NSDEF

#    Print NSDEF Is defined

#endif

 

 

Differences from QB

 

New to FreeBASIC

 

See also

 

#macro

# Preprocessor Stringize

## Preprocessor Concatenate

#ifdef

#unuef

Csnst

...