си - переменная в нескольких файлах без extern

программирование си extern

Можно ли объявлять переменную в ЯП си в разный файлах без extern? А функции так же можно объявлять?
Будет ли это одна и та же переменная или разные?

a.c:

int a;
void f(){printf("%d ",a);}

b.c

int a;
/* extern ? */ void f();
int main(){printf("%d ",a);f();printf("%d ",a);}

Примечание:
Внимание, язык СИ. Без плюса, плюсплюса, минуса, минусаминуса, диеза, бемоля, шарпа, решеточки

Примечание:
К&R в оригинале цитаты нет? или еще лучше стандарт си или draft.

Примечание:
Darth Beleg, меня интересует данный код. как он будет работать? Особенно если сделать приваивания переменной a

Примечание:
Darth Beleg, что значит инициализатор? А если он будет одинаковый? И с функциями - если я в двух разных файлах определю
int function_global()
{return 0;}
то не будет работать?

По стандарту - подскажите пункты

Примечание:
а еще пункт J.5.11 (с99)

Примечание:
crimaniak, вопрос про два int без спецификаторов в 2 разных файлах. что будет тогда? 2 раза выделится память и куда будет ссылка? a если две инициализации??

зы. а линукс и дрова по вашему на лисп ли эрланг? очень много написано на чистых сях и много на нем будет писаться. как бы мс и не тянул одеяло в виде новых прогеров на бэсик и мэнэгед си-дот-нет. берем скажем google.com/codesearch : lang:c = 3,910,000. lang:c++ = 2,150,000 lang:java= 3,870,000. php = 819,000 perl = 487,000

Примечание:
ззы к вашему свведению, линкер на такое не ругнется (!)
Ответы:
Компилятор ругаться должен на попытку переопределения переменной/функции.
В хидере определи. А вообще хлобальная переменная - очень плохо.
Модификатор static для переменной поможет - сделает ее локальной для единицы компиляции. Переменные будут разные. Как в C, так и в C++. K&R, раздел 4.6. Можно применять и для функций тоже. http://masterpc.alfaspace.net/books/CCScience/book_C_programming/4/#p46
В данном коде переменная получилась одна (изменения видны и в a.c, и в b.c), и, видимо, это и подразумевается в стандарте C99 (другие не смотрел). Если в любом из файлов сделать переменную static, то изменения не будут влиять друг на друга.
Инициализатор - это начальное значение: int a = 2; например.
С функциями - не будет работать.
В стандарте это пункты 6.2.2, 6.7.1, 6.7.8, 6.9


15 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.