__FB_EVAL__
Intrinsic define (macro) performed by the compiler.
Syntax
`
__FB_EVAL__( arg )
`
Parameters
`arg`
argument
Description
Evaluates the argument (constant-expression) at compile time.
When the argument evaluation produces a string, `__FB_EVAL__` returns a string formatted with a preprocessor operator:
- a `Non-Escaped String Literal` (of form: `$"text"`),
- or an `Escaped String Literal` (of form: `!"text"`) if needed.
For other datatypes produced, simple `Literals` (of Integers, Floating Points, Booleans) without prefix/suffix are returned.
`__FB_EVAL__` macro is useful where there is any of the following:
- non functional expression (i.e. side-effects),
- needs to be evaluated (i.e. simplified, respecting the operator precedence) before passing it on,
- used in a place where fbc would not allow an expression.
Example
`
#print 1 + 2
#print __FB_EVAL__( 1 + 2 )
#print 4 * Atn(1)
#print __FB_EVAL__( 4 * Atn(1) )
/' Compiler output:
1 + 2
3
4 * Atn(1)
3.141592653589793
'/
`
`
' In this example, the three '__FB_EVAL__' are absolutely mandatory in this 'assign()' macro.
' Even for '__FB_QUOTE__( __FB_EVAL__( expr ) )', because for the case of expr = cos(1/x),
' 'cos(1/x)' must be properly evaluated before be quoted (after the previous 'assign("x", x+1)'),
' otherwise in that case 'cos(1/x+1)' is taken into account (giving 'cos(2)') instead of 'cos(1/(x+1))' (giving 'cos (1/2)')
' because the operator precedence is not applied by '__FB_QUOTE__'.
#macro assign( sym, expr )
__FB_UNQUOTE__( __FB_EVAL__( "#undef " + sym ) )
__FB_UNQUOTE__( __FB_EVAL__( "#define " + sym + " " + __FB_QUOTE__( __FB_EVAL__( expr ) ) ) )
#endmacro
#define x
assign( "x", 1 )
Print x
assign( "x", x+1 )
Print x
assign( "x", Cos(1/x) )
Print x
assign( "x", "hello" )
Print x
assign( "x", x+x )
Print x
/' Output:
1
2
0.877582...
hello
hellohello
'/
`
See also `__FB_ARG_EXTRACT__` example.
Version

- Since fbc 1.08.0

Differences from QB

- New to FreeBASIC

See also

- `__FB_QUOTE__`
- `__FB_UNQUOTE__`