Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопросы по стандартизации языка C, Pelles C 
:(
    Опции темы
S.A.G.
Дата 31.7.2006, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

Репутация: нет
Всего: 19



1. В разделе справки для Pelles C C99 language reference - Introduction - ISO C conformance читаем:

Цитата
Pelles C tries to conform to the current C language standard defined by ISO. Extensions to the ISO C standard are noted in the text. Because the extensions are not a part of the ISO C standard, their use may restrict portability of programs between systems. By default all extensions are disabled. To enable them, specify the /Ze (Microsoft extensions) and/or /Zx (Pelles extensions) compiler option.

С первым предложением никаких проблем. Но что за екстеншены такие для поддержки которых необходимо включать режимы /Ze и /Zx? И о каких вообще расширениях языка идет речь?

2. Для вывода на экран русскоязычного "Привет, мир!" нужно как минимум написать такой код:
Код

#define WIN32_DEFAULT_LIBS
#include <stdio.h>
#include <windows.h>
int main(int argc, char *argv[])
{
    char s1[] = "Привет, мир!\n";
    CharToOemA(s1, s1);
    printf(s1);
    return 0;
}

Для чего определять символ WIN32_DEFAULT_LIBS? Кстати без пресловутого /Ze это тоже нехочет работать. Понятно, что CharToOemA - API функция которая определена в каком-то .dll из стандартного комплекта для Windows. Но разве недостаточно просто включить файл windows.h?
В MVS 2005 это так работало, а в Pelles C Windows.h вообще какой-то маленький...  

Это сообщение отредактировал(а) main - 31.7.2006, 00:32


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
Pilligrim
Дата 31.7.2006, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 9.6.2006

Репутация: 1
Всего: 1



Просто вопрос: а зачем тогда перешел на Pelles C(?) если уже разбирался в VC++.
Второй момент: конечно код будет немаленьким! Посмотри сам: консоль-проект, а функция вообще-то для винды писана(это я про CharToOemA), ибо консоль и русский язык это берега одной реки(если не разных и параллельных!). Зачем тебе это? Выводи на английском! Тогда код у тебя сократится как минимум на 3 строчки.
Цитата
С первым предложением никаких проблем. Но что за екстеншены такие для поддержки которых необходимо включать режимы /Ze и /Zx? И о каких вообще расширениях языка идет речь?

Может это расширения для реализации возможности использования твоей прожки на платформе винды?


З.Ы. 
Не пробовал убрать #define WIN32_DEFAULT_LIBS? Я начинал писать на Dev C++, дык там компилятор генерил такой стандартный код, а без нено оказывается програ работает! 
PM MAIL   Вверх
S.A.G.
Дата 1.8.2006, 01:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

Репутация: нет
Всего: 19



Цитата
Просто вопрос: а зачем тогда перешел на Pelles C(?) если уже разбирался в VC++.

Разбирался но не разобрался. Если бы далеко зашел - не стал бы переходить. Но не жалею. Pelles C как-то покомпактней да и стандарт лучше чем студия поддерживает. (!) Попробовал выполнить пример на обозначенные инициализаторы и был удивлен. MVS 2005 выдавала ошибку. Как ни пытался юзать тип _Bool или Bool ничего не получалось а в Pelles C и то и другое прекрасно поддерживаеться. Думаю это не все приемущества этого компилятора.
Цитата
Второй момент: конечно код будет немаленьким! Посмотри сам: консоль-проект, а функция вообще-то для винды писана(это я про CharToOemA), ибо консоль и русский язык это берега одной реки(если не разных и параллельных!). Зачем тебе это? Выводи на английском! Тогда код у тебя сократится как минимум на 3 строчки.

А разве консоль-проект в виндозе это не есть по сути программа под винду? По по-моему - да.
Я не про размер кода говорю а про заголовочный файл Windows.h - в нем же должны быть описаны прототипы всех API - функций? Про язык - нехочу транслитом а инглиш неочень хорошо знаю дабы проги свободно писать. А нельзя ли про эти берега поподробней написать? Я совсем запутался в этих кодовых страницах, кодировках, наборах символов.
Цитата
Может это расширения для реализации возможности использования твоей прожки на платформе винды?

Компилятор вроде как под винду..
Цитата
Не пробовал убрать #define WIN32_DEFAULT_LIBS?

Пробовал - некатит smile
  

Это сообщение отредактировал(а) main - 1.8.2006, 01:09


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
Damarus
Дата 1.8.2006, 06:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

Репутация: 6
Всего: 29



Цитата(main @  1.8.2006,  02:06 Найти цитируемый пост)
Про язык - нехочу транслитом а инглиш неочень хорошо знаю дабы проги свободно писать. А нельзя ли про эти берега поподробней написать? Я совсем запутался в этих кодовых страницах, кодировках, наборах символов.

Сохраняй свои исходники в DOS-совской кодеровке (VS2005: File -> Advanced Save Options... -> Encoding: Cyrillic (DOS) - Codepage 866). Или используй UNICODE-версии функций:
Код

#include <iostream>

int wmain(int argc, wchar_t *argv[], wchar_t *envp[])
{
    _wsetlocale(LC_ALL, L"Russian");

    std::wcout << L"Привет мир!" << std::endl;
}

Цитата(Pilligrim @  31.7.2006,  20:03 Найти цитируемый пост)
Может это расширения для реализации возможности использования твоей прожки на платформе винды?

Цитата(main @  1.8.2006,  02:06 Найти цитируемый пост)
Компилятор вроде как под винду..

Это расширения языка. /Ze - расширения Microsoft, /Zx - расширения Pelles.

Добавлено @ 06:21 
Цитата(main @  1.8.2006,  02:06 Найти цитируемый пост)
Я не про размер кода говорю а про заголовочный файл Windows.h - в нем же должны быть описаны прототипы всех API - функций?

Если Windows.h неполный, не мучайся, скачай Platform SDK. Думаю его можно подключить к Pelles.

Это сообщение отредактировал(а) Damarus - 1.8.2006, 06:16
PM MAIL ICQ Jabber   Вверх
S.A.G.
Дата 2.8.2006, 05:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

Репутация: нет
Всего: 19



Цитата
Сохраняй свои исходники в DOS-совской кодировке (VS2005: File -> Advanced Save Options... -> Encoding: Cyrillic (DOS) - Codepage 866).

Спасибо, совет был бы особенно актуальным если бы я писал на VS2005 но для меня важна поддержка стандарта поэтому перешел на Pelles C. Там такой фичи с сохранением кода в нужной кодировке я невидел. smile Может существуют еще способы перевести исходный код в нужную кодировку?
Цитата
Или используй UNICODE-версии функций.

Я только начал учить язык C и мне к сожалению мало о чем говорит код на C++ да еще и с юникодовыми версиями функций. Немог бы, если не сложно, переписать этот код на C? Значит консоль поддерживает юникод? И какая вообще связь между кодовыми страницами и наборами ASCII, UNICODE, ANSI и т.д.(к примеру редактор исходного кода в той же VS2005 работает с кодовой страницей 1251)?
Цитата
Если Windows.h неполный, не мучайся, скачай Platform SDK. Думаю его можно подключить к Pelles.

Поддержка SDK в Pelles C повидимо есть так как я скачал и установил плагин Add-in SDK для Pelles C. Но пока еще не разобрался что такое SDK? Обьясни плиз на доступном русском. smile


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
Damarus
Дата 2.8.2006, 08:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

Репутация: 6
Всего: 29



Цитата(main @  2.8.2006,  06:29 Найти цитируемый пост)
Спасибо, совет был бы особенно актуальным если бы я писал на VS2005 но для меня важна поддержка стандарта поэтому перешел на Pelles C. Там такой фичи с сохранением кода в нужной кодировке я невидел.  Может существуют еще способы перевести исходный код в нужную кодировку?

Код, посути, обычный текстовый файл. Открой его в любом редакторе, который поддерживает разные кодировки, и сохрани в нужной. Но это гимор. Лучше так:
Цитата(main @  2.8.2006,  06:29 Найти цитируемый пост)
Я только начал учить язык C и мне к сожалению мало о чем говорит код на C++ да еще и с юникодовыми версиями функций. Немог бы, если не сложно, переписать этот код на C? Значит консоль поддерживает юникод? И какая вообще связь между кодовыми страницами и наборами ASCII, UNICODE, ANSI и т.д.(к примеру редактор исходного кода в той же VS2005 работает с кодовой страницей 1251)?

Тут дело даже не в UNICODE, а в том, что кодовую страницу консоли можно установить. Что и делают функции setlocale (ANSI) и _wsetlocale (UNICODE). Например так, без UNICODE:
Код

#include <locale.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
    setlocale(LC_ALL, ".1251"); // Устанавливаем кодовую страницу 1251
    printf("Привет мир!\n");
}

Цитата(main @  2.8.2006,  06:29 Найти цитируемый пост)
Поддержка SDK в Pelles C повидимо есть так как я скачал и установил плагин Add-in SDK для Pelles C. Но пока еще не разобрался что такое SDK? Обьясни плиз на доступном русском.

SDK это Software Development Kit. Platform SDK, соответственно, - Platform Software Development Kit. Содержит заголовочные файлы, библиотеки, инструменты и прочее для написания программ под Windows. Последняя версия: Windows® Server 2003 SP1 Platform SDK ISO Install

Это сообщение отредактировал(а) Damarus - 2.8.2006, 08:07
PM MAIL ICQ Jabber   Вверх
rsm
Дата 2.8.2006, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 999
Регистрация: 16.3.2005

Репутация: 2
Всего: 62



main, начинаем все с начала.

Цитата(main @  31.7.2006,  02:28 Найти цитируемый пост)
что за екстеншены такие для поддержки которых необходимо включать режимы /Ze и /Zx? И о каких вообще расширениях языка идет речь?

Расширения языка - это определение дополнительных, не содержащихся в стандарте, опций. Читаем справку, что включают расширения языка Microsoft:
Цитата
- The symbol _MSC_EXTENSIONS is defined and it's value is set to 1.
- The symbol _MSC_VER is defined and it's value is set to 1100.
- The symbol _INTEGRAL_MAX_BITS is defined and it's value is set to 64. [2.80]
- The symbol _PUSHPOP_SUPPORTED is defined and it's value is set to 1. [2.80]
- The symbol _STDCALL_SUPPORTED is defined and it's value is set to 1. [2.80]
- The symbol __STDC__ is undefined. [2.90]
- If the target processor is Intel, the symbol _M_IX86 is defined and it's value is set to 300 (if the option /Ox is specified the value is 600).
- If the target processor is ARM, the symbol _M_ARM is defined and it's value is set to 4. [2.0]
- If the option /MT or /MD is specified, the symbol _MT is defined.
- The data types __int8, __int16, __int32 and __int64 are defined.
- If the format of the output file is COFF, it's possible to use long names for source files.
- Functions with the attribute __stdcall, or functions without an explicit attribute when the option /Gz is specified, uses the STDCALL calling convention.
- Functions with the attribute __fastcall, or functions without an explicit attribute when the option /Gr is specified, uses the FASTCALL calling convention. [2.90]
- The extended attributes __declspec(dllimport) and __declspec(dllexport) are accepted.
- The statements for structured exception handling are accepted (__try, __except, __finally, __leave).
- Anonymous structures, unions and field names are accepted.
- Bitfields can, besides the normal data types, consist of the following types: char, unsigned char, short, unsigned short, long, unsigned long.
- A type cast can be used on a lvalue.
- 'Improve floating-point consistency' is turned off, i.e. floating-point calls are optimized. This can be changed with the option /Op-.

Смотрим так же, что включают авторские расширения языка:
Цитата
- Optional arguments, much like in C++. 
- Support for the GCC extension __typeof__ [4.00]. 
- Support for the GCC case range extension: case expr ... expr [4.00]. 
- Support for the GCC escape sequence \e (ASCII ESC) [4.00].


Цитата(main @  31.7.2006,  02:28 Найти цитируемый пост)
Для чего определять символ WIN32_DEFAULT_LIBS?

Чтобы линкер автоматически подключил библиотеки, из которых вызываются функции. Например, если ты подключил к проекту хидер "shellapi.h" и определил директиву WIN32_DEFAULT_LIBS, то библиотека "shellapi.lib" подключится к проекту автоматически. В противном случае ее придется прописать вручную в настройках проекта.

Цитата(main @  31.7.2006,  02:28 Найти цитируемый пост)
недостаточно просто включить файл windows.h

Недостаточно. Потому без включения расширений языка компилятор будет честно стараться действовать в рамках стандарта и обругает определения из хидера "windows.h" (и всех какие он включает) самыми грязными словами.

Цитата(main @  1.8.2006,  03:06 Найти цитируемый пост)
про заголовочный файл Windows.h - в нем же должны быть описаны прототипы всех API - функций?

Не должны. Многие функции вынесены в отдельные хидеры.

Цитата(main @  1.8.2006,  03:06 Найти цитируемый пост)
Про язык - нехочу транслитом а инглиш неочень хорошо знаю дабы проги свободно писать

Тогда остается либо использовать вызов функции CharToOem, либо вынести все строки в отдельный хидер и перед компиляцией конвертировать его в СР-866.

Цитата(main @  1.8.2006,  03:06 Найти цитируемый пост)
А нельзя ли про эти берега поподробней написать? Я совсем запутался

В консоль текст выводится в кодировке СР-866. В редакторе кода по-умолчанию используется кодировка СР-1251. При компиляции файла кодировка сохраняется. При запуске программы получается несоответствие: текст в СР-1251, а консоль - в СР-866.
PM MAIL   Вверх
S.A.G.
Дата 3.8.2006, 03:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

Репутация: нет
Всего: 19



Первое что хочу сделать - это поблагодарить форум. Такой оперативной помощи как здесь я невидел нигде - как в русском так и в украинском сегменте сети. А теперь по-сути дела. Некоторые вопросы разрешены, некоторые нет. Скажем все стало ясно насчет расширений языка - у компиляторов разных производителей они могут быть свои - для их включения предусмотрены специальные режимы соответствующих компиляторов. Делаеться это, повидимо, для повышения еффективности кода, для удобства программистов и т.д. С этим ясно.

1. Насчет Platform SDK

2Damarus
Цитата
Содержит заголовочные файлы, библиотеки, инструменты и прочее для написания программ под Windows.

Но ведь Windows API тоже содержит такие средства? Какая между ними разница? Каково предназначение Platform SDK? Последняя версия - версия Platform SDK производства Microsoft? Кстати для Pelles C тоже есть этот самый SDK, я его установил но как с ним работать - понять не смог. Но впечатление такое - этот самый SDK можно использовать для добавления новых фич в IDE для Pelles C. Кстати в их числе - преобразование текста в редакторе в консольную кодировку. Так как все-таки работать с Platform SDK?

2. Кодировки

Код
setlocale(LC_ALL, ".1251"); // Устанавливаем кодовую страницу 1251
_wsetlocale(LC_ALL, ".1251"); // Устанавливаем кодовую страницу 1251

Я запускал - у меня это не работает. Раз в обоих случаях устанавливаеться кодовая страница 1251 (кстати что это такое?), то какая разница между этими двумя функциями? "UNICODE-версии" - где используеться юникод? Какая разница между названиями - "кодовая страница" и "кодировка"?

3. Насчет WIN32_DEFAULT_LIBS

2rsm
Цитата
Чтобы линкер автоматически подключил библиотеки, из которых вызываются функции. Например, если ты подключил к проекту хидер "shellapi.h" и определил директиву WIN32_DEFAULT_LIBS, то библиотека "shellapi.lib" подключится к проекту автоматически.

Какая разница между автоматическим и не автоматическим подключением библиотек? Имееться ввиду .lib а не .dll? Но почему .lib раз речь идет о стандартных виндовых библиотеках? Или может быть я что-то непонимаю? Разве WIN32_DEFAULT_LIBS касаеться не только Win API библиотек?

Цитата
В противном случае ее придется прописать вручную в настройках проекта.

Как?

Это сообщение отредактировал(а) main - 3.8.2006, 03:37


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
Damarus
Дата 3.8.2006, 06:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

Репутация: 6
Всего: 29



Цитата(main @  3.8.2006,  04:15 Найти цитируемый пост)
Но ведь Windows API тоже содержит такие средства? Какая между ними разница? Каково предназначение Platform SDK?

Platform SDK это и есть Windows API (грубо говоря).
Цитата(main @  3.8.2006,  04:15 Найти цитируемый пост)
Последняя версия - версия Platform SDK производства Microsoft?

Да. Platform SDK кстате делает именно Microsoft.
Цитата(main @  3.8.2006,  04:15 Найти цитируемый пост)
Кстати для Pelles C тоже есть этот самый SDK, я его установил но как с ним работать - понять не смог. Но впечатление такое - этот самый SDK можно использовать для добавления новых фич в IDE для Pelles C. Кстати в их числе - преобразование текста в редакторе в консольную кодировку.

Видимо с Pelles C идет SDK для разработки plugin-ов. Это совершенно другая история. 
Цитата(main @  3.8.2006,  04:15 Найти цитируемый пост)
Так как все-таки работать с Platform SDK?

Что значит работать? Скачиваеш, устанавливаеш, в настройках Pelles указываеш новые пути к директориям include, lib и т.д. После этого при написании:
Код

#include <windows.h>

Будет использоваться файл windows.h из установленного Platform SDK.

Но возможно устанавливать отдельно Platform SDK не надо. В Pelles C он вероятно уже входит (возможно не полностью).
Цитата(main @  3.8.2006,  04:15 Найти цитируемый пост)
Я запускал - у меня это не работает. Раз в обоих случаях устанавливаеться кодовая страница 1251 (кстати что это такое?), то какая разница между этими двумя функциями?

Вторая функция:
Код

_wsetlocale(LC_ALL, L".1251"); // Устанавливаем кодовую страницу 1251

У меня обе работают.
Разница  в том, что вторая функция использует UNICODE строки, а первая - ANSI.

Цитата(main @  3.8.2006,  04:15 Найти цитируемый пост)
"UNICODE-версии" - где используеться юникод?

UNICODE используется в Windows NT и выше. В UNICODE каждый символ занимает два байта, что позволяет иметь более 65 тысяч символов в таблице (против 255 у ANSI). Если пишеш только для Windows NT и выше, нет смысла использовать ANSI строки, т.к. все ANSI функции (например MessageBoxA) являются обёртками для UNICODE функций (соотв. MessageBoxW).
Цитата(main @  3.8.2006,  04:15 Найти цитируемый пост)
Какая разница между названиями - "кодовая страница" и "кодировка"?

Никикой.
PM MAIL ICQ Jabber   Вверх
rsm
Дата 3.8.2006, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 999
Регистрация: 16.3.2005

Репутация: 2
Всего: 62



Цитата(main @  3.8.2006,  05:15 Найти цитируемый пост)
Каково предназначение Platform SDK?

В нем содержатся хидеры, библиотеки и небольшой набор инструментов для написания программ на С\С++ с непосредственным вызовом функций WinAPI. С непосредственным потому, что PSDK не включает каких-либо надстроек над WinAPI (типа MFC, ATL и иже с ними), кроме CRT.

Цитата(main @  3.8.2006,  05:15 Найти цитируемый пост)
Кстати в их числе - преобразование текста в редакторе в консольную кодировку

Попробовал - замечательно, просто замечательно, непременно буду юзать! Настраивается все очень легко:
  • скачиваешь и устанавливаешь SDK для своей версии IDE;
  • в главном меню: "Tools" -> "Customize...";
  • открываешь закладку "Add-ins";
  • ставишь флажок на пункте списка: "Convert OEM <-> ANSI characters";
  • перезапускаешь IDE;
  • выделяешь текст, подлежащий конвертации;
  • в главном меню "Source -> Convert to -> OEM characters" (в кодировку DOS) или "Source -> Convert to -> ANSI characters" (в кодировку Win);

Цитата(main @  3.8.2006,  05:15 Найти цитируемый пост)
как все-таки работать с Platform SDK?

Скачиваешь, устанавливаешь. Потом настраиваешь нужную IDE, добавляя в ее настройках пути к хидерам и к библиотекам. Для Pelles C for Windows это неприменимо, т.к. данная IDE является чисто C'шной, а PSDK рассчитан в первую очередь на С++ и заточен под компилятор от MS. Однако, для Pelles C for Windows PSDK и не нужен, т.к. он включен в дистрибутив.

Цитата(main @  3.8.2006,  05:15 Найти цитируемый пост)
Я запускал - у меня это не работает

У меня тоже не работает. Нормально работает только вот это:
Код

#define UNICODE
#define _UNICODE
#include <windows.h>

void start()
{
    DWORD dwRW;
    HANDLE hConsole;
    const wchar_t *szText = L"Халлоу, Ворлд! :)";

    hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    if(hConsole)
    {
        WriteConsole(hConsole, (LPVOID) szText, lstrlen(szText), &dwRW, NULL);
        CloseHandle(hConsole);
    }
}


Цитата(main @  3.8.2006,  05:15 Найти цитируемый пост)
Какая разница между названиями - "кодовая страница" и "кодировка"

Кодировка - установленная зависимость, когда некоторый символ записывается некоторым кодом (числом или символом). Кодовая страница - список (таблица) таких установленных зависимостей.

Цитата(main @  3.8.2006,  05:15 Найти цитируемый пост)
Но почему .lib раз речь идет о стандартных виндовых библиотеках?

Устроим небольшую прогулку в мир библиотек? smile

Для начала о том, что же такое библиотека функций. Библиотека функций (далее просто "библиотека") - это сборник некоторых функций, выполняющих полезную работу. Важным свойством библиотеки является ее общедоступность - получить возможность вызвать некоторую функцию может любая программа. Таким образом, библиотеки позволяют провести унификацию кода и сократить его количество - представь, какой был бы хаос, если бы в каждой программе приходилось каждый раз писать одинаковый код и что было бы, если б потребовалось его заменить?

Разберемся, что такое DLL (Dynamic Link Library"динамически подключаемая библиотека"). DLL являет собой общедоступную всем программам библиотеку, которую можно подключить с помощью функции WinAPI "LoadLibrary(Ex)" и вызывать из нее (библиотеки) нужные функции.

Теперь рассмотрим, что представляет собой LIB (Microsoft Library Format, не расшифровывается). LIB бывают двух типов: с кодом и без кода. LIB с кодом содержат в составе каждой функции ее код, такие библиотеки называют статическими. LIB без кода в составе каждой функции содержат лишь переходник на одноименную функцию, вызываемую из DLL (например, в LIB содержится функция "CreateFileA", которая является лишь переходником к функции "CreateFileA", находящейся в библиотеке "kernel32.dll"). Такие LIB-библиотеки называют подключаемыми.

Зачем нужны статические и подключаемые LIB? И те, и другие используются линкером (сборщиком), когда он собирает ЕХЕ-файл. Работает линкер следующим образом: он исследует выданный компилятором промежуточный объектный (OBJ) файл и запоминает вызовы всех импортируемых (вызываемых извне, из DLL или LIB) функций (например, функций WinAPI). Затем, линкер просматривает список заданных ему LIB-библиотек и ищет в них требуемые функции. При обнаружении в LIB нужной функции события разворачиваются по двум направлениям. Если LIB статическая, то линкер извлекает полностью весь код функции и записывает его в ЕХЕ-файл. Если LIB подключаемая, то в ЕХЕ-файл записывается название функции и название DLL-библиотеки, откуда эту функцию следует вызывать. Например, если требуется вызывать функцию "CloseHandle" из DLL "kernel32.dll", то в ЕХЕ-файл так и будет записано: функция - "CloseHandle"; библиотека - "kernel32.dll". В дальнейшем, при запуске ЕХЕ-файла, системный загрузчик обнаружит эту запись и подключит библиотеку "kernel32.dll" для того, чтобы из нее можно было вызвать функцию "CloseHandle".

LIB-библиотеки из PSDK в большинстве своем являются подключаемыми. Исключение составляет библиотека CRT и еще несколько других.

Далее, раз уж так пошло, разберемся, зачем нужны хидеры. В хидерах (*.h; *.hpp) представлено описание функций (в нашем случае - функций WinAPI). Описание это нужно для того, чтобы компилятор мог: во-первых, проверить правильность твоего кода - вдруг ты функции вместо числа строку подсовываешь или пару аргументов указать забыл?; и во-вторых, узнать значения констант (например, ERROR_SUCCESS) или размер структур (например, OPENFILENAMEA). В получаемый после компиляции объектный (OBJ) файл прописываются имена импортируемых из DLL и/или LIB функций, которые потом будет искать линкер (об этом процессе написано выше).

Директива "WIN32_DEFAULT_LIBS" указывает компилятору, чтобы он добавил линкеру в список поиска LIB-библиотек нужные библиотеки. Рассмотрим в качестве примера кусок кода из хидера "shellapi.h":
Код

#if defined(WIN32_DEFAULT_LIBS) && !defined(_WINCE) /* если определена директива "WIN32_DEFAULT_LIBS"
                                                          и не определена директива "_WINCE", то */
#pragma comment(lib, "shell32.lib"); // добавить в список поиска LIB-библиотек библиотеку "shell32.lib"
#endif

Добавить библиотеку в список поиска можно и вручную в настройках проекта:
  • в главном меню: "Project -> Project options...";
  • открыть закладку "Linker";
  • в текстовом поле "Library and object files" указать все нужные библиотеки, разделяя их пробелами;

PM MAIL   Вверх
S.A.G.
Дата 4.8.2006, 04:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

Репутация: нет
Всего: 19



2Damarus
Цитата
Видимо с Pelles C идет SDK для разработки plugin-ов. Это совершенно другая история.

Какая? Platform SDK - это разработка Microsoft для продуктов этой фирмы? Тогда что такое Platform SDK для Pelles C? Может быть автор просто так назвал средство для разработки плагинов для своей IDE? (кстати это единая функция Platform SDK - плагины?)

2rsm
Цитата
В нем содержатся хидеры, библиотеки и небольшой набор инструментов для написания программ на С\С++ с непосредственным вызовом функций WinAPI. С непосредственным потому, что PSDK не включает каких-либо надстроек над WinAPI (типа MFC, ATL и иже с ними), кроме CRT.

Раз вызов непосредственный то что за функции находяться в библиотеках PSDK? Разве эти функции не выступают посредниками между программистом и WinAPI? Или я что-то непонимаю?
Цитата
Попробовал - замечательно, просто замечательно, непременно буду юзать!

Надаже как это я незаметил. Перерыл же все, а в "customize" не полез. smile Единственный минус в этом - крякозябры теперь будут в IDE. Но можно выносить текст сразу в коментарий справа.
Цитата
Однако, для Pelles C for Windows PSDK и не нужен, т.к. он включен в дистрибутив.

Я его устанавливал отдельно.
Цитата
Кодировка - установленная зависимость, когда некоторый символ записывается некоторым кодом (числом или символом). Кодовая страница - список (таблица) таких установленных зависимостей.

Какая разница между ANSI (это кодовая страница?) и кодовой страницей 1251?
Цитата
Директива "WIN32_DEFAULT_LIBS" указывает компилятору, чтобы он добавил линкеру в список поиска LIB-библиотек нужные библиотеки.


Насчет библиотек все ясно, спасибо. smile
Насчет "WIN32_DEFAULT_LIBS".
Рассмотрим известную нам WinAPI функцию CharToOem(). В MSDN содержиться следующая инфа:

Minimum DLL Version: user32.dll
Header: Declared in Winuser.h, include Windows.h 
Import library: User32.lib 
Minimum operating systems: Windows 95, Windows NT 3.1 
Unicode: Implemented as ANSI and Unicode versions.

В исходном коде мы включаем хидер windows.h. В нем есть ссылка на хидер Winuser.h. Тот в свою очередь содержит прототип этой функции и ссылку на нужную библиотеку. Разве линкеру недостаточно этой информации?

Это сообщение отредактировал(а) main - 4.8.2006, 04:42


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
rsm
Дата 4.8.2006, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 999
Регистрация: 16.3.2005

Репутация: 2
Всего: 62



Цитата(main @  4.8.2006,  06:37 Найти цитируемый пост)
что за функции находяться в библиотеках PSDK

Там находятся описания функций, констант, структур и пр. WinAPI.

Цитата(main @  4.8.2006,  06:37 Найти цитируемый пост)
Разве эти функции не выступают посредниками между программистом и WinAPI?

Если это функции-обертки вокруг функций WinAPI - тогда да, получается некое посредничество. Например, функция CRT "malloc" является оберткой вокруг функции WinAPI "HeapAlloc". В противном случае никакого посредничества нет, функции WinAPI вызываются напрямую.

Цитата(main @  4.8.2006,  06:37 Найти цитируемый пост)
Какая разница между ANSI (это кодовая страница?) и кодовой страницей 1251?

В 1967 году ANSI (American National Standards Institute, "Американский Институт Национальных Стандартов") опубликовал первую редакцию стандарта ASCII (American Standard Code for Information Interchange, "американский стандартный код для обмена информацией"). Сей стандарт описывал кодовую страницу для букв американского алфавита, а так же некоторых дополнительных символов. Кодировка была 7-ми битной и соответственно могла включать до 128-ми символов. В дальнейшем, стандарт переработали и улучшили, назвав Extended ASCII ("расширенный ASCII"). В нем кодировка была уже 8-ми битной и включала соответственно до 256-ти символов.
На основе стандарта Extended ASCII корпорация Microsoft разработала две группы кодовых страниц: одну группу для DOS и консольных программ (кодировки OEM-437, 720, 737, 775, 850, 852, 855, 857, 858, 862, 866, 874, 1258) и вторую группу для программ с GUI, не поддерживающих кодовых страниц стандарта Unicode (кодировки ANSI-874, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258).

Мой тебе совет - не грузись сильно всей этой ботвой с кодировками. Ибо среди них такой бедлам, что сам Гейтс ногу сломит - кроме ANSI есть еще много организаций, разрабатывавших стандарты на кодовые страницы (ISO например); плюс есть еще и национальные кодовые страницы, заточенные под конкретный язык (например, KOI8-R для русского и KOI8-U для украинского); и так далее.
Для программирования под Windows человеку русскоязычному вполне хватит знаний о существовании трех кодировок:
  • ОЕМ-866 (IBM-866, CP-866, DOS-кодировка) - используется в DOS и в консольных программах;
  • ANSI-1251 (WIN-1251, CP-1251, WIN-кодировка) - используется повсюду в Windows, если при установке выбрана русская локаль;
  • UTF-16 (стандарт Unicode) - используется почти во всех WinAPI для ОС Windows серии NT (NT, 2k, XP, 2k3);
Все необходимые для преобразования этих кодировок между собой функции есть среди набора функций WinAPI.

Цитата(main @  4.8.2006,  06:37 Найти цитируемый пост)
прототип этой функции и ссылку на нужную библиотеку

Прототип есть, а вот где ты там нашел ссылку? Или это ты так назвал строчку "#pragma comment(lib, "user32.lib")"?

Цитата(main @  4.8.2006,  06:37 Найти цитируемый пост)
Разве линкеру недостаточно этой информации?

Линкер хидерами не пользуется, его удел - сборка из объектных (OBJ) файлов результирующего ЕХЕ-файла. Такой подход используется для обеспечения максимальной гибкости.

Это сообщение отредактировал(а) rsm - 4.8.2006, 12:14
PM MAIL   Вверх
Damarus
Дата 5.8.2006, 07:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

Репутация: 6
Всего: 29



Цитата(main @  4.8.2006,  05:37 Найти цитируемый пост)
Какая? Platform SDK - это разработка Microsoft для продуктов этой фирмы? Тогда что такое Platform SDK для Pelles C? Может быть автор просто так назвал средство для разработки плагинов для своей IDE? (кстати это единая функция Platform SDK - плагины?)

Ты путаеш. В Pelles C входят два SDK (SDK это не название - это абривеатура: Software Development Kit):
Platform SDK - разработка Microsoft, об этом писал rsm.
Add-in SDK - разработка производителей Pelles, этот SDK используется для написания плагинов (Add-in) к Pelles.

PM MAIL ICQ Jabber   Вверх
S.A.G.
Дата 6.8.2006, 01:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

Репутация: нет
Всего: 19



2rsm
Насчет PSDK всеравно непонял.. может порекомендуешь хорошую книгу про PSDK(что это такое, как относиться к винде и для чего оно нужно) и кстати кодировки где бы было все хорошо расписано на доступном, понятном языке? Раз это все относиться к платформе Windows то может быть это книга про эту ОС? Не представляю как можно еффективно писать проекты без знания платформы.
Цитата
Прототип есть, а вот где ты там нашел ссылку? Или это ты так назвал строчку "#pragma comment(lib, "user32.lib")"?

Да, эта строчка будет выполнена если в программе будет объявлен символ "WIN32_DEFAULT_LIBS":
Код
#if defined(WIN32_DEFAULT_LIBS) && !defined(_WINCE)
#pragma comment(lib, "user32.lib")

Но разве нельзя обойтись без этого условия? Так ведь делаеться в компиляторе от MS?
Но если код функции CharToOem() находиться в user32.lib то зачем тогда user32.dll? Или в либе только ссылка? Если да тогда зачем столько промежуточных инстанций?
Цитата
Линкер хидерами не пользуется, его удел - сборка из объектных (OBJ) файлов результирующего ЕХЕ-файла.

А кто пользуеться? Компилер?
2Damarus
То что разные вещи понял - но что такое PSDK - нет.

Это сообщение отредактировал(а) main - 6.8.2006, 01:23


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
Damarus
Дата 6.8.2006, 01:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

Репутация: 6
Всего: 29



Цитата(main @  6.8.2006,  02:13 Найти цитируемый пост)
То что разные вещи понял - но что такое PSDK - нет.

Может это поможет: Windows API
PM MAIL ICQ Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1343 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.