Extern "C" and "cdecl"

Why does the compiler treat extern "C" and extern "cdecl" as different conventions?

I’m not familiar with calling conventions and extern in Rust myself, but did you read an over what the various ABI strings mean in the first place? E.g. here is a list in the reference. Fairly concise of course, and I for sure couldn’t tell you in any detail what similarities and differences these entail on which platforms.

1 Like

Is the fact that they are not the same a good enough reason? I'm not sure why you would expect that two different calling conventions be the same.

Can you please explain how these two differ?

From the document @steffahn linked:

  • extern "C" -- This is the same as extern fn foo(); whatever the default your C compiler supports.
  • extern "cdecl" -- The default for x86_32 C code.

It explicitly says that the former is a different choice for different platforms, while the latter is a calling convention for a specific platform (x86_32). They are separate things with separate meanings.

3 Likes