-
-
Notifications
You must be signed in to change notification settings - Fork 310
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
C/C++ scanner: add __has_include #4517
Comments
For reading enjoyment, here's a snazzy C++ example from cppreference.com using #if __has_include(<optional>)
# include <optional>
# define has_optional 1
template<class T> using optional_t = std::optional
#elif __has_include(<experimental/optional>)
# include <experimental/optional>
# define has_optional -1
template<class T> using optional_t = std::experimental::optional
#else
# define has_optional 0
# include <utility>
template<class V>
class optional_t
{
V v_{}; bool has_{false};
public:
optional_t() = default;
optional_t(V&& v) : v_(v), has_{true} {}
V value_or(V&& alt) const& { return has_ ? v_ : alt; }
/*...*/
};
#endif Don't have any clear idea how to teach the scanner to handle this case, where a system header is used if it exists, if not an experimental header is used, and if neither, some inline code is used. We don't usually generate dependencies for "system headers", but the algorithm is unsophisticated - if it's not found, assume it's a system header and don't generate the dep, which has the potential to miss headers which will be generated by the build. There's of course no rule that says this check-for-include-file functionality has to be limited to system headers. |
Does the default scanner do ifdefs? or is it just the optional scanner which does? |
They use the same base class which does recognize |
A preprocessor identifier
__has_include
was added to the C standard in the 2023 edition; the same identifier has appeared in the C++ standard since the 2017 edition (one of the justifications for adding to C was to keep the preprocessors relatively aligned). The identifier allows coding conditional inclusion of a header file, and thus affects SCons dependency scanning. Since most C compilers are also C++ compilers, this identifier is widely implemented already.From the standard, here is example usage:
As a shorter write-up than going through the entire standard, here is the accepted proposal which added it to C:
https://open-std.org/JTC1/SC22/WG14/www/docs/n2799.pdf
The text was updated successfully, but these errors were encountered: