# TIP 641: Let Tcl_GetBoolean(FromObj) handle (C99) bool.
Author: Jan Nijtmans <[email protected]>
State: Final
Type: Project
Vote: Done
Created: 02-Oct-2022
Tcl-Version: 8.7
Tcl-Branch: tip-641
Vote-Summary: Accepted 3/0/0
Votes-For: JN, KBK SL
Votes-Against: none
Votes-Present: none
-----
# Abstract
This TIP proposes new behavior for public routines **Tcl\_GetBoolean**
and **Tcl\_GetBooleanFromObj**: It's `boolPtr` argument can now point
at a `bool` as well as an `int`.
# Specification
Since C99 (and also recent C++ compilers), there's a new `bool` type,
which can only have the values `true` or `false`. Tcl predates this,
therefore it doesn't have an API to handle this type directly: In
stead of `bool` the only portable way to use it, is use an `int`
temporary variable, and convert it manually to the desired type.
For example, see [here](https://core.tcl-lang.org/tcl/file?ln=1193-1201&ci=00b136d44a3e6499&name=win%2FtclWinSock.c)
(which uses the Microsoft-specific `BOOL`, but the idea is the same).
Some platforms use `sizeof(bool) == sizeof(char)`, other platforms use
`sizeof(bool) == sizeof(int)`. Therefore, we can implement this with
already existing functions (the `char` variant depends on TIP #618).
We just define 2 macro's `Tcl_GetBoolean/Tcl_GetBooleanFromObj`, which
map to the original functions if `sizeof(*(boolPtr)) == sizeof(int)`
and to `Tcl_GetBool/Tcl_GetBoolFromObj` when `sizeof(*(boolPtr)) == sizeof(char)`.
A panic will result it none of those two match (but that's actually impossible
when using `bool`).
# History
This implementation used to be part of TIP #618, but doing that led to a
lot of discussion. Since that TIP did multiple unrelated proposals,
it was decided to split it: TIP #618 introduces the new API which
makes this TIP possible at all. This TIP explains how the new API
can be used to handle the C99/C++ `bool` type, just be defining
two new macro's.
# Compatibility
This is 100% upwards compatible.
# Reference Implementation
Under development on the [tip-641](https://core.tcl-lang.org/tcl/timeline?t=tip-641) branch.
# Copyright
This document has been placed in the public domain.