C++ Logo

std-proposals

Advanced search

Re: [std-proposals] Revising #pragma once

From: Andrey Semashev <andrey.semashev_at_[hidden]>
Date: Tue, 27 Aug 2024 22:35:17 +0300
On 8/27/24 21:35, Jeremy Rifkin wrote:
>> Yes, it does. It makes the behavior different from what is expected by
> majority of users. And is prone to subtle errors, if different headers
> happen to match in contents.
>
> The current behavior expected by the majority of users is hard to argue
> about because the semantics aren’t spelled out anywhere and every
> implementation does it differently. #pragma once represents the loose
> concept of single inclusion, and the semantics proposed here are not
> prone to the subtle errors of mtimes happening to match, symbolic or
> hard links not being handled well, certain filesystem mount behavior, or
> multiple copies of the same header being unintentionally included more
> than once (e.g. if a library header is copied around).
>
> There are few to no cases where you would want to include a file with
> the same exact contents with #pragma once multiple times. The only case
> presented here has to do with including a header of only macros then
> undefining everything then redefining. Such use probably shouldn’t be
> using an include guard in the first place and it’s important to note
> that traditional include guards might cause problems there too.

It's not about wanting or not wanting to include headers with exact same
contents. It may happen by accident that there are two headers that have
the same contents, and that are using the proposed `#pragma once`, and
that would prevent those headers to be included. I'm saying that the
fact that this probability exists, however low it may seem, is a bug in
specification, which makes the proposal unacceptable. Basically, if a
user has to gamble on whether the feature works correctly then that
feature should not exist in the standard.

The fact that gcc took the approach to compare file contents I consider
a poor choice, and not an argument to standardize this implementation.

> On Tue, Aug 27, 2024 at 12:28 Andrey Semashev via Std-Proposals
> <std-proposals_at_[hidden] <mailto:std-proposals_at_[hidden]>>
> wrote:
>
> On 8/27/24 20:14, Jeremy Rifkin wrote:
> > Does using contents for #pragma once break any practical or plausible
> > uses of #pragma once? Does it have any clear downsides?
>
> Yes, it does. It makes the behavior different from what is expected by
> majority of users. And is prone to subtle errors, if different headers
> happen to match in contents.
>
> > I don’t think does. It should only make things more robust and
> portable.
> >
> > Jeremy
> >
> > On Tue, Aug 27, 2024 at 12:07 Andrey Semashev via Std-Proposals
> > <std-proposals_at_[hidden]
> <mailto:std-proposals_at_[hidden]>
> <mailto:std-proposals_at_[hidden]
> <mailto:std-proposals_at_[hidden]>>>
> > wrote:
> >
> > On 8/27/24 17:01, Jeremy Rifkin via Std-Proposals wrote:
> > > Hi,
> > > I have drafted a proposal for standardizing #pragma once.
> This has
> > been
> > > previously proposed a few years ago and I recognize that on
> top of
> > being
> > > difficult to standardize, existing opinions on this topic may
> > render the
> > > paper dead on arrival. However, due to its widespread nature and
> > > concerns about portability contributing to it not being used
> more I
> > > think it's worth revisiting. I have uploaded the first draft at:
> > >
> >
> https://jeremy-rifkin.github.io/cpp-proposals/drafts/pragma-once-draft-1.html <https://jeremy-rifkin.github.io/cpp-proposals/drafts/pragma-once-draft-1.html> <https://jeremy-rifkin.github.io/cpp-proposals/drafts/pragma-once-draft-1.html <https://jeremy-rifkin.github.io/cpp-proposals/drafts/pragma-once-draft-1.html>> <https://jeremy-rifkin.github.io/cpp-proposals/drafts/pragma-once-draft-1.html <https://jeremy-rifkin.github.io/cpp-proposals/drafts/pragma-once-draft-1.html> <https://jeremy-rifkin.github.io/cpp-proposals/drafts/pragma-once-draft-1.html <https://jeremy-rifkin.github.io/cpp-proposals/drafts/pragma-once-draft-1.html>>>.
> >
> > I think, using file contents for `#pragma once` is wrong and
> should not
> > be standardized. The intended effect of `#pragma once` has
> always been
> > to avoid including *the same header* twice, not *the same
> content*.
> >
> > --
> > Std-Proposals mailing list
> > Std-Proposals_at_[hidden]
> <mailto:Std-Proposals_at_[hidden]>
> <mailto:Std-Proposals_at_[hidden]
> <mailto:Std-Proposals_at_[hidden]>>
> > https://lists.isocpp.org/mailman/listinfo.cgi/std-proposals
> <https://lists.isocpp.org/mailman/listinfo.cgi/std-proposals>
> > <https://lists.isocpp.org/mailman/listinfo.cgi/std-proposals
> <https://lists.isocpp.org/mailman/listinfo.cgi/std-proposals>>
> >
>
> --
> Std-Proposals mailing list
> Std-Proposals_at_[hidden] <mailto:Std-Proposals_at_[hidden]>
> https://lists.isocpp.org/mailman/listinfo.cgi/std-proposals
> <https://lists.isocpp.org/mailman/listinfo.cgi/std-proposals>
>

Received on 2024-08-27 19:35:32