Differences from QB
FreeBASIC introduced a -lang command-line option, that is used to change the language compatibility mode. Use the -lang qb option when compiling to select the most QB compatible parser. All differences listed below assume that -lang qb was used.
Architecture/Platform incompatibilities

- FreeBASIC is written for 32-bit operating systems and a 32 bit DOS extender, and cannot utilize code which depends on 16-bit DOS, 16 bit assembly or memory model (segment & offset, XMS/EMS, ...).
- `DEF SEG` is no longer necessary and will not work - any code which `POKE`s to video memory this way will no longer function, however, for DOS it can be easily rewritten using DPMI features.
- `CALL INTERRUPT` no longer functions, as it relies on 16-bit DOS. DOS interrupts can be called in the DOS32 version by using the DPMI library, but they might work slowly because of the 32bit-16bit-32bit mode changes the processor will have to perform.

Changed due to ambiguity

- A scalar variable and an array with the same name and suffix can no longer share the same name.
- `SHARED` can't be used inside a `SUB` or `FUNCTION` as it resulted in shared variables not defined in the main program. A proper `DIM SHARED` in the main program must be used.
- `COMMON` declarations do not depend on the order they are made, variables are matched by name and for that reason named COMMON is no longer supported. All COMMON arrays are variable-length arrays in FB.
- If a single line `If` has an (unnecessary) colon directly after the `THEN`, it has to be terminated by an `End If` in FB. If that unneeded colon is removed, FB will behave as QB.

Design differences

- Graphics support was internally redesigned, see GfxLib overview
- `CLEAR` is no longer used to reset all variables and set the stack. Variables must be reset one by one, and stack size can be changed in the compiler command line. The keyword `CLEAR` is used to do memory fills in FB.
- String `DATA` items must be enclosed in quotes in FB, in QB this was optional
- All functions must have been declared, even with a `CALL` in FreeBASIC. With `CALL` it was possible to invoke prototype-less functions in QuickBASIC. (to be supported in future with -lang qb)
- In FreeBASIC all arrays must be explicitly declared. (Interpreted QuickBASIC arrays are automatically created with up to 10 indices.)
- Strings use a null (char `0`) terminator to be compatible with C libraries and the Windows API, fixed-length strings can't contain `chr$(0)` chars for now.
- When `INKEY`[`$`] reads an extended key (Num Pad, Arrows...) it returns a two character string. In FB the first character is `CHR`[`$`]`(255)`, while in QB this first char is `CHR$(0)`.
- With fixed length strings FreeBASIC gives the real length as `Len` plus one (null-char), even on `Type` fields.
- In FreeBASIC, unused characters of fixed-length strings are set to `0`, regardless of what "-lang" compiler option is used. In QB, unused characters are set to `32` (space, or " ", in ASCII).
- When a fixed-length string is declared, but still not initialized, all characters are set to 0, both in FreeBASIC and QB.
- The arrays are stored in row-major order in FB, they were stored in column-major order in QB by default. Row major order: data with consecutive last index are contiguous. Column-major order: data with consecutive first index are contiguous. For example, if you have `DIM A(1 TO 6, 1 TO 8)`, in row-major order the elements are stored such that `A(3,5)` is followed in memory by `A(3,6)`; in column-major order `A(3,5)` is followed in memory by `A(4,5)`.
- Programs don't stop anymore on runtime errors unless -e, -ex or -exx option is used in the command line. Using these options allow the use of QB style error handling (`ON ERROR`, `RESUME`...).
- Octal numbers are written `&o...`, whereas in QB they could be written as `&o...` or `&...`.
- In FB `FOR` loops in subs/functions do not accept arguments received `byref` as counters. A local variable must be used.
- FB's `Locate` does not respect the fourth and fifth arguments for cursor shape.
- FB's `Screen` does not allow switching the visible or the work-page. Use `ScreenSet` instead.
- FB's `Color` does not allow a third argument for border color.
- FB's `Timer` returns the number of seconds since the computer started, while QB's `TIMER` returns the number of seconds since midnight. (Win32 and Linux only: No more wrapping at midnight! :))
- In QB a `chr$(13)` inside a string did a `CR+LF` when `PRINT`ed. In FB the `CHR(13)` prints just at what it is, a `CR`.
- `EOF` can no longer be used to detect an empty comms buffer. Empty buffer should be tested comparing `Loc` with `0` in FB. Also, for files opened in `RANDOM` or `BINARY` mode, `EOF` returns non-zero already after reading exactly the file size, see `EOF`.
- Integer variables do not signal overflow errors in FB, even with the -ex or -exx option on. Any QB code relying in catching integer overflow errors will not work in FB.

Archaic commands

- `BSAVE` and `BLOAD` can be used in FB only to save and retrieve screens or graphic buffers. They will work only if gfxlib is linked, this is, if a graphics screen mode is requested somewhere in the program. The console can't be saved with `BSAVE` or retrieved with `BLOAD`. The other use of `BSAVE`-`BLOAD`, saving and loading full arrays, can be achieved easily with `GET` and `PUT`.
- `FIELD` statement (for record definition at runtime) has been left aside. The keyword `FIELD` is used in FB to specify field alignment in `Type` variables.
- PC Speaker commands no longer function: Any references to `SOUND` or `PLAY` statements will result in an error message. There is a third party library available to emulate this functionality, but it's not included with FreeBASIC.
- Fake event-driven programming (`ON KEY`, `ON PEN`, `ON STRIG`, `ON TIMER`) no longer works. They could be emulated by a separate library.
- `MKSMBF$` and all the `MKxMBF$` commands supporting the pre-QB4.0 Microsoft proprietary floating point format (MBF) are not implemented.
- The use of parenthesis in the arguments passed to a function to emulate by-value passing is not permitted. The `CALL` quirk resulting in all arguments being passed by value, no longer works. The proper `ByVal` and `ByRef` keywords must be used.
- `FILES` is not implemented. Instead, PDS 7.1-compatible `Dir`[`$`] can be used.
- `IOCTL`, `ERRDEV` and `ERRDEV$`, low level functions to access hardware are not implemented as they were OS-dependent.
- `CALL ABSOLUTE` to run inline machine code is no longer supported. Instead you can use `Asm...END ASM` blocks to insert inline assembler commands. Or use the `ASM ...` one line command.