GRRRLPower extern - ключевое слово для объявления, показывает компилятору, что определение будет приведено далее в этом файле или в каком либо-другом файле. Можно было в main.c сделать #include "func.h", а в func.h накатать extern int func(); Естественно в func.c тоже сделать #include "func.h". Вот как я подразумевал - связь через h-ник. Естественно то был пример в первую очередь ва-листов, а не вычисления факториала
Rel Неопределён на этапе компиляции клиента ф-ции, я имею в виду. iface.h: Код (Text): int do_something(); client1.c: Код (Text): #include "iface.h" int client1() { return do_something(); } client2.c: Код (Text): #include "iface.h" int client2() { return do_something(opt1, opt2, opt3); } impl1.c: Код (Text): #include "iface.h" /*void*/ int do_something() { //... } impl2.c: Код (Text): #include "iface.h" /*void*/ int do_something(int opt1, int opt2) { //... } client2 может линковаться с обоими реализациями, client1 - только с impl1.
им все равно, главное чтобы вы передали адрес на стеке... как найти адрес - уже другой разговор... для этого можно написать свою кросплатформенную реализацию _AddressOfReturnAddress, например с помощью ассемблера yasm... вот вам еще один каверзный вопрос... про ILP32 (x86) и LLP64 (x64)... если разложить аббревиатуру, то ILP32: "int long pointer 32", LLP64: "long long pointer 64"... соответственно int* - 64-разрядный указатель, указывающий на 32-разрядное знаковое число... при прибавлении 1 к указателю на int, значение указателя увеличится на 4, а не на 8... это потенциальный генератор ошибок при переносе на x64 платформу... с адресной арифметикой вообще всегда надо точно знать, что делаешь... ЗЫ про LLP64 - касается винды... про другие оси нужно отдельно уточнить, модель может быть другой... ясно... у нас было небольшое недопонимание в понятиях... просто на этапе компиляции в вашем примере все же известно, как можно вызывать функцию, это меня смутило)
green Не линкуется ни в одном случае, так как прототип do_something возвращает значение int, а реализация do_something тип void. Компилятор не пропускает чтобы прототип и реализация одной и той же функции возвращали значение разного типа. И вообще объявление и определение одной и той же функции должны совпадать между собой.
Момент 2 В языке Си в определении функции требуется обязательно задавать имена всех аргументов. Код (Text): int func(int a,int b){return 0;} В языке Си++ определение функции возможно без имен аргументов Код (Text): int func(int a,int){return(0);} Таким образом программист может на будущее зарезервировать неиспользуемый аргумент при этом не получая сообщения о том, что аргумент не используется в теле функции.
Каков размер базовых встроенных типов данных в байтах(int, char, float, double)? На RSDN по этому поводу такой горячий спор (но никто точно не говорит), который привел к тому, что некоторые личности не считают, что в байте 8 бит(!!!!) Пишут: A byte is at least large enough to contain any member of the basic execution character set and is composed of a contiguous sequence of bits, the number of which is implementation-defined.
Опытным путем получил размер встроенных типов данных (в байтах) для 32-разрядной аппаратной платформы x86.
все это именно так, как здесь сказано... более того придраться в этих словах не к чему... какой ты молодец! сходи съешь пирожок) и открою тебе секрет - signed и unsigned тип имеют одинаковый размер, мог бы не проверять... по поводу размерности можно написать целую таблицу: Код (Text): ТИП | LP64 | ILP64 | LLP64 | ILP32 | LP32 char | 1 | 1 | 1 | 1 | 1 short | 2 | 2 | 2 | 2 | 2 int | 4 | 8 | 4 | 4 | 2 long | 8 | 8 | 4 | 4 | 4 long long | 8 | 8 | 8 | 8 | 8 void* | 8 | 8 | 8 | 4 | 4 может где ошибся, не стесняйтесь поправлять)
Rel Можно я угадаю почему - в знаковом типе данных просто старший бит отводится под знак. Таким образом машине грубо говоря все равно какой диапазон чисел кодировать от 0 до 255 или от -128 до 127. Фишка в том, что байтом можно закодировать 256 чисел, то есть 2^8 различных состояний. Модели данных - http://www.viva64.com/ru/t/0012/ Кстати а Вы могли бы привести пример архитектуры, где байт не является набором из 8-ми бит?
старший бит в младшем байте, если вспомнить, как хранятся "несколько-байтовые" числа) с википедии, она же первая ссылка в гугле:
Я делаю вывод, что байт - это минимальный адресуемый набор битов. Иначе нет смысла называть 32-бита байтом.
теперь эта фраза преобрела смысл? могу вас еще больше "шокировать"))) изначально "бит" мог принимать три значения: -1, 0, 1, но от этого пришлось отказаться в пользу двоичной системы счисления, так как очень неудобно представлять десятичные числа в троичной системе счисления...
Так хоть 16... Рассмотрим 32-разрядную шину адреса. Возьмем одну линию из этой шины - всего 32 линии по каждой передаётся один бит информации за такт. Так вот если по этой линии гнать сигнал, который может лишь принимать два фиксированных значения - для примера +3 В и +1 В, то мы кодируем 1 бит, способный принимать два значения(0,1). Если по этой битовой линии гнать сигнал, способный принимать фиксированные 16 различных значений напряжения, то мы закодируем бит, способный принимать 16 значений. То есть по битовой линии АДРЕСНОЙ ШИНЫ будет гнаться за один такт не 1 или 0, а любое 16-ричное число (0,1,2,...C,D,E,F). Кстати есть сложный QAM-сигнал (c квадратурной амплитудной модуляцией), в котором можно сразу закодировать 256 фиксированных значений (за счет изменения фазы и амплитуды сигнала), он на биты даже не разменивается, за раз гонит по одному байту.
Rel А в двоичной что, удобно что-ли? Неудобно писать в любой системе счисления отличной от десятичной. Привыкать надо долго. А история была чуть более сложной. То ли троичность загнулась в силу неоптимальности, то ли ей просто не повезло. И кстати бит никогда не мог принимать больше двух значений. bit -- это сокращение от BInary digiT А у кого-нибудь есть ссылка не на википедию, подтверждающая то, что в креях байтом считается 32 бита? Ну или хотя бы, голословная ссылка на свой опыт работы с суперкомпьютерами Cray? Просто мне как-то не верится в это.
тонкий троллинг то были только рассуждения в сторону DNA компьютеров и насколько я знаю они остались в теории на бумажке
в двоичную вполне нормально... десять целочисленно не делится на три, если это канеш имеет значение... допустим в простом представлении чисел с плавающей точкой, получались бы бесконечные 3 и 6 в периоде))) ну а вы как думаете, для чего я слово бит кавычками обвел) главное, не то как я сказал, а то, что вы меня поняли)) вообще мне этот момент запомнился с первой лекции какого-то предмета еще в университете... может я канеш путаю что-то... ЗЫ: http://www.govnokod.ru/5561
Кто-нибудь может объяснить для чего в Си используется оператор унарный плюс? Походу чтобы на собеседованиях можно было спрашивать, как распарсится x+++y (к иксу прибавить префиксный инкремент игрека). И еще - некоторые говорят, что в С и С++ нет приоритета операций, в качестве примера приводят i = j ? k : l = m; , что выполняется как i = (j ? k : (l = m)). Что Вы думаете по этому поводу.