2016-07-26 2 views
2

Похоже, что в C++ extern (NOT, за которым следует литерал строки языка) не имеет никакого отношения к объявлениям функций в области пространства имен (Difference between declaration of function with extern and without it). Но имеет ли он какое-либо влияние на объявления функций области блока? Или это объявление локальной функции без extern, всегда эквивалентное одному с extern?Разница между объявлением функции local/block-scope функцией с extern и без нее

namespace { 
    void f() { 
    extern void g(); // has external linkage 
    g(); 
    } 
    void f2() { 
    void g();  // always the same, as if, without extern 
    g(); 
    } 
} 

Спасибо!

+0

Зачем вам объявлять функцию внутри функции? Как вы думаете, что он делает? –

+0

Противоположность extern - static - 'static void g(); // внутренняя связь. –

+0

@underscore_d проверить http://stackoverflow.com/questions/1034606/is-there-any-use-for-local-function-declarations – EulersRainbow

ответ

2

Правила, здесь происходят из [ basic.link]:

Название функции, объявленной в области блока, и имя переменной, объявленной областью блока extern , имеют связь. Если есть видимое объявление объекта с привязкой с тем же именем и , игнорируя объекты, объявленные вне самой внутренней охватывающей области пространства имен, объявление области видимости объявляет тот же объект и получает связь с предыдущей декларацией. Если имеется более одного такого объекта , программа плохо сформирована. В противном случае, если соответствующий объект не найден, объект области видимости блока получает внешнюю связь.

Таким образом, нет никакой разницы между объявлением функции области блока с и без external. Но обратите внимание на интересный пример:

static void f(); 

void g() { 
    extern void f(); // internal linkage 
} 

Здесь блок прицел f redeclares ::f и получает такую ​​же связь: внутренний. Хотя это отмечено extern. Но наличие отсутствия ключевого слова extern несущественно

1

Независимо от того, имеет ли функция спецификатор extern или нет, в любом случае она имеет внешнюю связь (если она явно не объявлена ​​как внутренняя связь).

Однако объявление локальной функции может скрыть другие объявления функций с тем же именем во внешней области.

Рассмотрим следующий пример показательной программы

#include <iostream> 

void f(int) { std::cout << "F(int)" << std::endl; } 
void f(short) { std::cout << "f(short)" << std::endl; } 

int main() 
{ 
    void f(short); 

    f(10); 

    return 0; 
} 

Его выход

f(short) 

Если прокомментировать локальную декларацию, то выход будет

F(int) 
+0

Я чувствую, что этот ответ подчеркивает использование локальных деклараций функций больше, чем ответ на вопрос о том, существуют ли какие-либо сценарии, которые имеют наличие или отсутствие extern в объявлении локальной функции? Или я чего-то не хватает? Также будут оценены любые ссылки на стандарт C++. Благодаря! – EulersRainbow

+0

@EulersRainbow Локальная декларация может быть полезна, когда есть конфликт между объявлением функции и объявлением функции с тем же именем в какой-либо библиотеке, когда разрешение имени является ambiguios. Что касается ссылки на стандарт, к сожалению, у меня нет копии Стандарта или его проекта вручную. –

+0

Спасибо. Я думаю, что я понимаю их пользу - и ваш пример отлично справляется с выгодой для местных заявлений. Но меня больше интересует вопрос: основываясь на стандарте C++, это действительно ли разница, если я добавлю «extern» в объявление локальной функции? – EulersRainbow