Why this extern "C" fails ?

What is your compile line?

This works fine, IIRC the extern must be in global scope.

#include

extern “C” {
int a = 42;
}

int main() {
{
{ std::cout << a << “\n”; }
}
return (0);
}

--------------

#include <iostream>

int main() {
  {
    extern "C" { int a = 42; }
    { std::cout << a << "\n"; }
  }
  return (0);
}

Hi Arji,

As Olafur said, extern symbols should be in a global scope, and that "a"
couldn't even be seen from the next line, and you'd see another error from
the compiler if you removed the extern.

main.cpp:5:12: error: expected unqualified-id

    extern "C" { int a = 42; }
           ^
1 error generated.

It's not enough to me to explain why this is not working.

Every compiler error assumes familiarity with the language, at least enough
to go and look at the definition of the terms involved in the error message
(extern "C" in this case) in a book, on the web or the standard, which
should give you enough information on how to fix the bug.

Compilers are famous for not giving enough information on error messages,
and Clang stands out as being one of the best on that side, but no compiler
will ever teach you the language via error messages.

One rule of thumb is to use a different compiler and see if it also gives
you an error, maybe a different error, or a better error message, or none
at all. If you find that other compilers can handle your code and Clang
cannot, maybe Clang is wrong (in which you should fill a bug), or maybe the
other compiler is wrong at accepting your code, (in which you should file a
bug in the other compiler). However, if the error is the same (which it is
in GCC), than there's little you can ask the Clang community to do
something.

As for learning C++, I suggest you buy Stroustroup's "The C++ Programming
Language", read it cover to cover, and have it as your faithful companion
for such cases, or use comp.lang.c++ for when you can't find the answer
yourself, but Clang's list is really not the place for that level of
discussion.

cheers,
--renato

Renato Golin <renato.golin-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
writes:

[...]

As Olafur said, extern symbols should be in a global scope, and that "a"
couldn't even be seen from the next line, and you'd see another error from
the compiler if you removed the extern.

More generally, namespace scope (global scope is a special case, IIUC).

[...]

“extern symbols should be in a global scope”

Can you provide a reference for this statement ?

2013/7/29 Renato Golin <renato.golin@linaro.org>

Yes it works, but it’s not reflecting my case.

2013/7/29 Ólafur Waage <olafurw@gmail.com>

Did not find the reference telling extern( May be need a thorough searching in the std. But quick search gave this
copy pasted from Section 7.1.1

  1. The extern specifier can be applied only to the names of variables and functions. The extern specifier cannot
    be used in the declaration of class members or function parameters. For the linkage of a name declared with
    an extern specifier, see 3.5. [ Note: The extern keyword can also be used in explicit-instantiations and
    linkage-specifications, but it is not a storage-class-specifier in such contexts. — end note ]

So the usage
extern “C” { int a = 42; }

seems to be illegal as it is neither variable and function.

But again, I am not C++ language specialist and not a compiler guy

I don’t remember if there is a direct reference for this statement, I think it is more a result of the language rules surrounding it. Devchandra’s quote is the most direct one I think.

Lets say this example of yours would work. How would you reference this variable you just made?