Decorate C prototypes

Martin Sebor sebor@roguewave.com
Fri May 1 18:02:00 GMT 2009


tom fogal wrote:
> Martin Sebor <sebor@roguewave.com> writes:
>> Mark Mitchell wrote:
>> [...]
>>> 2. We should verify that the compiler accepts
>>>
>>>   extern "C" void abort(void);
>>>   namespace std {
>>>     extern "C" void abort(void) throw();
>>>   }
>>>
>>> and:
>>>
>>>   namespace std {
>>>     extern "C" void abort(void) throw();
>>>   }
>>>   extern "C" void abort(void);
>>>
>>> That's important in case a user explicitly declares the function, or
>>> #include's the C header.
>> gcc 4.3.1 (the latest I have access to at the moment) does accept
>> this even though it's ill-formed according to [except.spec], p2:
>>
>>    If any declaration of a function has an exception-specification,
>>    all declarations, including the definition and an explicit
>>    specialization, of that function shall have an exception-
>>    specification with the same set of type-ids.
> 
> Yes, but are those really the same functions?  It seems to me like one
> is `abort' and the other is `std::abort'.  Without any sort of using
> declaration, these are distinct ... no?

They are one and the same function. According to [dcl.link], p6:

     At most one function with a particular name can have C language
     linkage.

Martin

> 
> -tom



More information about the Libstdc++ mailing list