Прерывает ли объявление extern статической функции внутреннюю связь? - PullRequest
1 голос
/ 18 января 2012

У меня есть теоретический вопрос.

Вот пример:

file1.c

static void foo()
{
    ...
}

file2.c

extern void foo(); 

main()
{
    foo();
}

Компиляция в порядке.

Итак, extern нарушает внутреннюю связь статического объявления?

Ответы [ 3 ]

4 голосов
/ 18 января 2012

Является ли "компиляция в порядке" только в теории, или вы действительно проверяли это?

Функция static не должна быть видна снаружи модуля компиляции (обычно файла C), в котором он находится.

Объявление функции с тем же именем с extern в другом модуле компиляции не должно изменить это.

Убедитесь, что вы действительно собрали и связываете тестовую программу должным образом, поскольку в противном случае все, что вы тестируете, это то, что вы можете иметь "висячую" ссылку на внешний символ (ссылка на функцию foo из 2.c). Сборка 2.c в исполняемый файл (т. Е. Его связывание) должна завершиться неудачей.

0 голосов
/ 18 января 2012

Быстрый тест подтверждает ожидаемый сбой компоновщика (VC ++ 2010 express):

1> test.obj: ошибка LNK2019: неразрешенный внешний символ «void __cdecl foo (void)» (? Foo @@ YAXXZ)ссылка в функции _wmain

0 голосов
/ 18 января 2012

Компиляция должна быть в порядке.Если вы также можете связать это, у вашего компилятора есть проблема.

...