Внешние функции в C ++ - PullRequest
7 голосов
/ 02 июня 2011

При выходе из функции в файле cpp компилятор обрабатывает их по-разному?

extern void foo(char * dataPtr);  
void foo(char *);
extern void foo(char * );  

Мне интересно, потому что я видел все это в коде и не уверен, в чем разница.

Ответы [ 4 ]

9 голосов
/ 02 июня 2011

Индивидуально:

 extern void foo(char * dataPtr);  

функции имеют внешнюю связь по умолчанию, поэтому внешний не нужен - это эквивалентно:

 void foo(char * dataPtr);

Имена параметров не имеют значения в объявлениях функций, поэтому приведенное выше эквивалентно:

 void foo(char * );  

Используйте то, что вам нравится больше всего.

2 голосов
/ 02 июня 2011

Нет.Все они одинаковые функции.Существует только одна функция, а именно с этой сигнатурой:

void foo(char *);

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

1 голос
/ 02 июня 2011

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

Мой лучший вывод о том, почему они пометили ее как внешнюю, возможно, потому что объявление функции находится в заголовочном файле, но определениев соответствующем файле с, как и следовало ожидать.Это похоже на то, как extern обычно используется в типе int (где вы хотите объявить его, но планируете связать его из какого-то другого источника). Так что это форма документации.

Это лучшийобъяснение связи со мной:

http://publications.gbdirect.co.uk/c_book/chapter4/linkage.html

1 голос
/ 02 июня 2011

extern является связью по умолчанию для функций C ++. Нет разницы между этими тремя декларациями.

...