Skip to content
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

Clarify conditional compilation #1338

Merged

Conversation

gokhanettin
Copy link
Contributor

@gokhanettin gokhanettin commented Apr 23, 2020

Introduction of cfg attribute and cfg! macro operators can be confusing. cfg! macro and cfg attribute behave differently in terms of conditional compilation. While cfg attribute enables conditional compilation of some code, cfg! macro conditionally evaluates to true or false literals for run-time checks.

@rust-highfive
Copy link

Thanks for the pull request, and welcome! The Rust team is excited to review your changes, and you should hear from @marioidival (or someone else) soon.

If any changes to this PR are deemed necessary, please add them as extra commits. This ensures that the reviewer can see what has changed since they last reviewed the code. Due to the way GitHub handles out-of-date commits, this should also make it reasonably obvious what issues have or haven't been addressed. Large or tricky changes may require several passes of review and changes.

Please see the contribution instructions for more information.

@gokhanettin
Copy link
Contributor Author

gokhanettin commented Apr 24, 2020

The Result Reference also describes cfg! macro as one of the ways of conditional compilation. But I still find it a little bit confusing.

For the attribute case, compiler decides what to compile at compile time, which I would call conditional compile. For the macro case, the macro conditionally evaluates to either true or false literals at compile time, which can then be used at run-time.

Obviously following cfg.rs won't compile. Neither rustc cfg.rs nor rustc cfg.rs --cfg "some_condition" works as one of the functions is not (conditionally) compiled.

#[cfg(some_condition)]
fn needs_some_condition() {
}

#[cfg(not(some_condition))]
fn not_needs_some_condition() {
}

fn main() {
    if cfg!(some_condition) {
        needs_some_condition();
    }

    if cfg!(not(some_condition)) {
        not_needs_some_condition();
    }
}

@gokhanettin gokhanettin force-pushed the clarify-conditional-compilation branch from b44a1f3 to 63408e1 Compare April 24, 2020 08:12
Introduction of `cfg` attribute and `cfg!` macro operators can be
confusing. `cfg!` macro and `cfg` attribute behave differently in terms
of conditional compilation. While `cfg` attribute enables conditional
compilation of some code, `cfg!` macro conditionally evaluates to `true`
or `false` literals for run-time checks.
@gokhanettin gokhanettin force-pushed the clarify-conditional-compilation branch from 63408e1 to b4bf16b Compare April 24, 2020 08:17
@marioidival marioidival merged commit 05c59cb into rust-lang:master Apr 24, 2020
@marioidival
Copy link
Member

@gokhanettin Thank you for you clarification

Dylan-DPC-zz pushed a commit to Dylan-DPC-zz/rust that referenced this pull request Apr 28, 2020
Update books

## nomicon

5 commits in 6eb24d6e9c0773d4aee68ed5fca121ce3cdf676a..4d2d275997746d35eabfc4d992dfbdcce2f626ed
2020-04-06 02:21:15 +0200 to 2020-04-27 10:24:52 -0400
- Fix example in FFI, section NPO
- Update implementation code of `split_at_mut`
- Use rust-lang/rust linkchecker on CI.
- Use just `std::_` instead of `::std::_`
- Remove illegal space.

## reference

2 commits in 3ce94ca..ed22e6fbfcb6ce436e9ea3b4bb4a55b2fb50a57e
2020-04-11 17:00:27 +0200 to 2020-04-24 12:46:22 -0700
- Fix grammer for tuple patterns and tuple struct patterns (rust-lang/reference#794)
- Document drop scopes (rust-lang/reference#514)

## book

2 commits in f5db319e0b19c22964398d56bc63103d669e1bba..e37c0e84e2ef73d3a4ebffda8011db6814a3b02d
2020-04-13 08:06:03 -0500 to 2020-04-26 09:31:36 -0500
- Mention short-circuiting in Appendix 02 (rust-lang/book#2318)
- Increase HTTP buffer size and add 'Content-Length' header (rust-lang/book#2246)

## rust-by-example

8 commits in c106d1683c3a2b0960f0f0fb01728cbb19807332..ffc99581689fe2455908aaef5f5cf50dd03bb8f5
2020-04-09 09:14:39 -0300 to 2020-04-24 15:05:04 -0300
- Fix Example -> Examples (rust-lang/rust-by-example#1340)
- Make unsuffixed literal plural (rust-lang/rust-by-example#1335)
- Ensure example error matches the comment (rust-lang/rust-by-example#1336)
- Add missing triple backticks (rust-lang/rust-by-example#1339)
- Clarify conditional compilation (rust-lang/rust-by-example#1338)
- Clarifies how to customize lib crate name (rust-lang/rust-by-example#1337)
- Fix bytes of youkoso in shiftjis (rust-lang/rust-by-example#1333)
- Fix possible typo (rust-lang/rust-by-example#1334)

## embedded-book

4 commits in 668fb07b6160b9c468f598e839c1e044db65de30..40beccdf1bb8eb9184a2e3b42db8b8c6e394247f
2020-04-13 12:38:16 +0000 to 2020-04-26 17:44:14 +0000
- Add hint on memory config to GDB debugging section  (rust-embedded/book#215)
- Adds cargo-generate to installation instructions  (rust-embedded/book#213)
- collections: Fix example allocator  (rust-embedded/book#206)
- Flip111/patch 8  (rust-embedded/book#233)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants