Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

#include и условная компиляция ...

44K
24 мая 2010 года
mlt^^
63 / / 01.04.2010
Вопрос как избежать множественного подключения одного файла в большом проекте.
Допустим у меня есть главный модуль (main.cpp) и дополнительный (misc.h).
Я в главном подключаю #include "misc.h" затем мне нужно написать ещё один модуль (my_dll.h) и в нём мне тоже кое что нужно из misc.h я там пишу #include "misc.h" и потом компилятор ругается что мол одно и тоже 2 раза пишу.
Как от этого избавиться и почему не возникает таких проблем с файлами типа #include <iostream> (их где угодно подключай сколько хочешь и никаких проблем) .... Заранее спасибо =)
11
24 мая 2010 года
oxotnik333
2.9K / / 03.08.2007
 
Код:
#pragma once

в этом заголовочнике, и компил. будет подключать один раз для всех, кому он нужен
44K
24 мая 2010 года
mlt^^
63 / / 01.04.2010
Работает, спасибо =) Я уж хотел дефайнить какую-нибудь константу а потом условно подключать типа
 
Код:
#ifndef MISC
  #include "misc.h"
  #define MISC
3
24 мая 2010 года
Green
4.8K / / 20.01.2000
Цитата: mlt^^
Работает, спасибо =) Я уж хотел дефайнить какую-нибудь константу а потом условно подключать типа
 
Код:
#ifndef MISC
  #include "misc.h"
  #define MISC


Ну и такой способ подойдет, только надо в условие оборачивать не include, а весь код подключаемого файла.
И такой способ более универсальный, т.к. #pragma once - это нестадартное расширение языка и поддерживается не всеми компиляторами.

 
Код:
// misc.h
#ifndef MISC
#define MISC

<source code>

#endif //MISC
44K
04 июня 2010 года
mlt^^
63 / / 01.04.2010
Разумно ли реализовывать с помощью условной компиляции локализацию ? то есть возможность "выбрать язык" ?
Код:
// подключаем заголовочные файлы
#ifdef RUS
#define COUT std::wcout
#define str L"Строка"
#endif
#ifdef ENG
#define COUT std::cout
#define str "string"
#endif
...
COUT<<str<<std::endl;

потом в главное проге перед подключением этого файла писать напрмиер #define RUS или #define ENG и будет соответсвенный язык
Может есть боле удобные и легкие механизмы сделать тоже-самое ?
5
04 июня 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: mlt^^
Разумно ли реализовывать с помощью условной компиляции локализацию ? то есть возможность "выбрать язык" ?


1) Вот это точно не круто:

 
Код:
#define COUT std::wcout

2) В нормальных программах локализацию делают из ресурсов.
Аноним
Не совсем верный ответ - локализация имхо итак итак быдет в ресурсах а вот из каких ресурсов её собирать - для этого можно использовать флаг условной компиляции. Во всяком случае я делал так в двух крупных проектах
5
04 июня 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: pervoPROkodetz
Не совсем верный ответ - локализация имхо итак итак быдет в ресурсах а вот из каких ресурсов её собирать - для этого можно использовать флаг условной компиляции.

На этот счет выбор ресурсного файла локализации лучше настраивать билд-скриптом.

Аноним
у меня примерно так и было - для базы данных был свой sql запрос который набивал базу данными в зависимости от локализации а вот окошки диалогов и тд строилось
по флагу компиляции - просто проект был огромный и проще было ввести флаги где нужно чем писать билд скрипт для него.
5
04 июня 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: pervoPROkodetz
окошки диалогов и тд строилось
по флагу компиляции - просто проект был огромный и проще было ввести флаги где нужно чем писать билд скрипт для него.

Как-то странно, нестыковочка - проект большой, а билд скрипта нету, или у нас разнятся понятия "билд скрипт". Для меня это все что собирает проект, чем бы это ни было - msbuild, ant, make и т.п.

Аноним
однако его действительно не было в том виде о каком вы пишите
был постоянно дорабатываемый проект-сборщик. Сделано там многое было коряво но делалось оно сильно до меня - команда к моему приходу работала уже с этим монстром

А где можно подробнее про билд скрипты почитать? Какая система популярнее для зазработки проектов в VS?
И, Hardcase, если можно, запость сюда какой-нить реальный пример
44K
04 июня 2010 года
mlt^^
63 / / 01.04.2010
Цитата: hardcase

1) Вот это точно не круто:
 
Код:
#define COUT std::wcout


А что круто ? чтобы в коде писать COUT<<someone; и COUT в зависимости от языка либо с wcout либо с cout был ?

3
04 июня 2010 года
Green
4.8K / / 20.01.2000
Цитата: mlt^^
А что круто ? чтобы в коде писать COUT<<someone; и COUT в зависимости от языка либо с wcout либо с cout был ?


А что тебе мешает всегда использовать wcout ?

5
04 июня 2010 года
hardcase
4.5K / / 09.08.2005
(далее оффтоп)
Цитата: pervoPROkodetz
А где можно подробнее про билд скрипты почитать? Какая система популярнее для зазработки проектов в VS?
И, Hardcase, если можно, запость сюда какой-нить реальный пример

Я не разрабатываю на C++ - бог миловал. :) Моя .NET-чик: C#/Nemerle. Для VS2005/2008/2010 родным является msbuild, хотя до VS2010 C++ был вкорячен туда отдельным тулчейном, но с приходом .NET 4.0 SDK msbuild научился собирать и C++.

44K
04 июня 2010 года
mlt^^
63 / / 01.04.2010
Предположим я захотел таким (довольно таки легким способом) сделать игрушечную локализацию. Я пишу файл типа
 
Код:
#ifdef RUS
#define test L"Тестирование"
#endif
#ifdef ENG
#define test "Testing"
#endif

Вот, у меня уже есть проект с 5-6 модулями и главным модулем с main ? где что подключать надо, чтобы во всех файлах, где я поменял символьные константы на дефайны из этого файла, небыло проблем и где прописывать #define RUS или ENG (ну я так понимаю в модуле с main перед инклюдом этого файла локализации) ... подскажите истиный путь ..
44K
04 июня 2010 года
mlt^^
63 / / 01.04.2010
Или мождет быть лучше сделать файлы гед просто будут в зависимости от какого- либо условия определяться константы строковые ? например
 
Код:
if(loc==rus)
{
std::string test(L"Тестирование");
}
else
{
std::string test("Testing");
}
3
04 июня 2010 года
Green
4.8K / / 20.01.2000
Цитата: mlt^^
Или мождет быть лучше сделать файлы гед просто будут в зависимости от какого- либо условия определяться константы строковые ? например
 
Код:
if(loc==rus)
{
std::string test(L"Тестирование");
}
else
{
std::string test("Testing");
}


А может, просто, взять книжку либо погуглить и разобраться, чем wcuot обличается от cout, чем L"" отличается от "".
Ведь вопросы то задаешь глупые, которые решить можно без форума в течении 5-10 минут.
В твоем понимании wcout - это объект работы с русским текстом? :)

44K
05 июня 2010 года
mlt^^
63 / / 01.04.2010
в моем понимании wcout это обьект работающий с wchar_t то есть с двухбайтовым чаром, соответсвенно с другой кодировкой, юникодом например ... соответственно вроде в юникоде номера русских букв отличаются wchar_t и просто char так как размер разный , следовательной простая "" константа занимает место в памяти места в 2 раза меньше чем L"" и нормально выводится она только обьектом задроченым именно под wchar_t .... вот как то так ..
3
05 июня 2010 года
Green
4.8K / / 20.01.2000
Цитата: mlt^^
в моем понимании wcout это обьект работающий с wchar_t то есть с двухбайтовым чаром, соответсвенно с другой кодировкой, юникодом например ... соответственно вроде в юникоде номера русских букв отличаются wchar_t и просто char так как размер разный , следовательной простая "" константа занимает место в памяти места в 2 раза меньше чем L"" и нормально выводится она только обьектом задроченым именно под wchar_t .... вот как то так ..



Ну так и что тебе мешает работать только wchar (wcout и т.д.) ?
Жалко памяти? :)
А ты посчитал на сколько увеличится расход памяти?
В процентах от всей используемой программой памяти?
Не занимайся никчемной оптимизацией.

44K
05 июня 2010 года
mlt^^
63 / / 01.04.2010
Код:
#include <iostream>
#include <ostream>
#include <string>
#include <cstdlib>
using namespace std;
int main()
{
    //setlocale(LC_ALL, "");
    wcout<<L"Еманарот народ."<<endl;
    wstring wstr;
    wchar_t str[20];
    getline(wcin, wstr);
    wcout<<wstr;
    std::system("pause");
    return 0;
}

Либо я чего то не понимаю, либо это действительно не так просто, как кажется.
P.S. Если не ставить локаль, то русские буквы вообще не выводятся, а если ставить то с wstr траблы.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог