this post was submitted on 09 Nov 2025
73 points (97.4% liked)

Linux

10053 readers
747 users here now

A community for everything relating to the GNU/Linux operating system (except the memes!)

Also, check out:

Original icon base courtesy of lewing@isc.tamu.edu and The GIMP

founded 2 years ago
MODERATORS
 

Two patches queued into the Linux kernel's build system development tree, kbuild-next, would enable the -fms-extensions compiler argument everywhere for allowing GCC and LLVM/Clang to use the Microsoft C Extensions when compiling the Linux kernel. Being in kbuild-next these patches will likely be submitted for the Linux 6.19 kernel merge window next month but remains to be seen if there will be any last minute objections to this change.

The -fms-extensions compiler option honored by the GNU Compiler Collection and LLVM/Clang allow enabling some non-standard C/C++ constructs used within Microsoft header files and honored by the the Microsoft Visual C/C++ compiler. For Linux kernel development purposes, enabling the Microsoft C Extensions would allow including a tagged struct or union anonymously in another struct/union.

all 20 comments
sorted by: hot top controversial new old
[–] BombOmOm@lemmy.world 56 points 22 hours ago (1 children)

Pedant thought: The thumbnail shows one biting everywhere but the bullet.

[–] mojofrododojo@lemmy.world 16 points 17 hours ago (1 children)

it's time we nibbled the casing and come to terms with bite the bullet, it's just a bad metaphor.

[–] klangcola@reddthat.com 4 points 7 hours ago

In Danish and Norwegian the equivalent idiom is to "Swallow a camel" which sounds much funnier xD

[–] Truscape@lemmy.blahaj.zone 25 points 1 day ago (1 children)

Would this cause consequences in terms of the project's independence? Or are these extensions able to be distributed freely?

[–] GreenCrunch@piefed.blahaj.zone 74 points 23 hours ago* (last edited 23 hours ago) (4 children)

From what I can see, the GNU Compiler Collection supports this flag, so you can still build it with 100% free software.

Basically, it's just behavior that doesn't align with the C standard, but was introduced by MS. Then, GCC added a compiler flag which makes it behave like that, so that you can build code that requires that behavior.

It doesn't seem to actually be dependent on MS, rather it's named after them because it emulates the way their compiler works. I hope no Linux maintainers would entertain the idea of making it dependent on a non-free compiler.

[–] Valmond@lemmy.world 1 points 8 hours ago

int $ = 3;

Compiled with msvc back in the day for example, could be stuff like that. But IDK.

[–] clif@lemmy.world 20 points 20 hours ago

behavior that doesn’t align with the C standard ... but was introduced by MS

Yep, that tracks. I'm still pissed off about microsoft's non-standard implementation of HTTP 1.1 from however long ago it was that I had to conditionally work around it on the server side. They believe standards don't apply to them and it seems like they're right.

[–] Truscape@lemmy.blahaj.zone 21 points 23 hours ago

Ah, that makes sense. Thanks for the explanation! :)

[–] just_another_person@lemmy.world 16 points 23 hours ago

The correct answer. It's just using an extension Microsoft happens to have made, and everything still works fine without it.

[–] iloveDigit@piefed.social 20 points 23 hours ago (5 children)
[–] UnityDevice@lemmy.zip 7 points 6 hours ago

Once in a while, it turns out that enabling -fms-extensions could allow some slightly prettier code. But every time it has come up, the code that had to be used instead has been deemed "not too awful" and not worth introducing another compiler flag for.

That's probably true for each individual case, but then it's somewhat of a chicken/egg situation.

If we just "bite the bullet" as Linus says and enable it once and for all, it is available whenever a use case turns up, and no individual case has to justify it.

A lore.kernel.org search provides these examples:

Undoubtedly, there are more places in the code where this could also be used but where -fms-extensions just didn't come up in any discussion.

Basically the extensions are useful sometimes. Note that they have nothing to do with Microsoft other than being invented by them.

[–] ZILtoid1991@lemmy.world 3 points 6 hours ago

The "extend" phase of EEE.

[–] entwine@programming.dev 67 points 21 hours ago (2 children)

I'm sitting around doing IT shit waiting things to download/backup/install/etc and have nothing better to do, so here's an AI-free explanation with code samples:

It's basically just a code style thing. Standard C allows you to declare unnamed structs/unions within other structs/unions. They must be unnamed, so it'd look like this:

struct test {
        int a;
        struct {
                char b;
                float c;
        };
        double d;
};

Which is fine, but the -fms-extensions flag enables you to do the same thing with named structs. For example:

struct test {
        int a;
        struct test2 {
                char b;
                float c;
        };
        double d;
};

without -fms-extensions, the above will compile, but won't do what you might assume. b and c will be members of struct test2, not test. So something like this won't compile:

struct test my_test;
my_test.b = 1; // error: ‘struct test’ has no member named ‘b’

But with the flag, not only does it work, it also lets you do some convenient things like this:

struct test2 {
        char b;
        float c;
};
struct test {
        int a;
        struct test2;
        double d;
};
//...
struct test my_test;
my_test.b = 1; //OK

That is, you can reuse an existing struct definition, which gives you a nice little tool to organize your code.

Source: https://gcc.gnu.org/onlinedocs/gcc/Unnamed-Fields.html

[–] ijhoo@lemmy.ml 6 points 9 hours ago (1 children)

If this is so convenient, why wasn't it made a part of a newer C standard?

[–] entwine@programming.dev 1 points 1 hour ago

It's not that convenient. I can't even think of a situation where this would be useful for structs, only unions. And in the case of unions, you usually want to keep them as small as possible (or better yet, avoid them altogether).

But besides that, C is a language that tends to prefer minimalism. Using macros, you can accomplish a similar thing already, even if it's not as nice.

[–] iloveDigit@piefed.social 7 points 21 hours ago

Nice, thank you

[–] HappyFrog@lemmy.blahaj.zone 6 points 22 hours ago

Some software require it sadly

[–] deegeese@sopuli.xyz 6 points 23 hours ago

Old languages should be able to learn new tricks.