Проблема при компиляции с константами
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 22.07.15 13:13
Оценка: :))) :))
На Visual C++ 2012 разрабатывается решение. В состав решения находится проект MathLib, в котором находятся файлы Types.h и Defconst.h . В файле Types.h определены типы ( например, typedef long double LDouble ), а в файле Defconst.h определены константы, в частности, определена константа

#define C 299792.458

Также в этом решении есть проект Orbit, который использует эти два файла (Defconst.h и Orbit.h).

При компиляции в проекте Orbit выдаётся ряд ошибок, связанных с системным файлом winnt.h . В частности, выдаётся ошибка

error C2059: синтаксическая ошибка: константа
файл winnt.h
строка 15607


В файле winnt.h в этой строке написано (выделено мною жирным шрифтом):

typedef struct _MAGE_ARM_RUNTIME_FUNCTION_ENTRY {
    DWORD BeginAddress;
    union {
        DWORD UnwindData:
        struct {
            // ...
            DWORD C: 1;
            // ...
        } DUMMYSTRUCTNAME;
    } DUMMYUNIONNAME;
} IMAGE_ARM_RUNTIME_FUNCTION_ENTRY, *PIMAGE_ARM_RUNTIME_FUNCTION_ENTRY:


То есть появляется конфликт имён--в файле winnt.h определено значение C со значением 1 как поле структуры DUMMYSTRUCTNAME, а в файле Defconst.h определена константа C со значением 2999792.458 .
Как разрешить эту проблему? Можно ли её решить без переименования константы C в файле Defconst.h -- например, что-то изменив в настройках Visual C++ ?
1613 г. = 2024 г.
Re: Проблема при компиляции с константами
От: watchmaker  
Дата: 22.07.15 13:47
Оценка: +1
Здравствуйте, RussianFellow, Вы писали:

RF>Как разрешить эту проблему? Можно ли её решить без переименования константы C в файле Defconst.h

Поменять порядок включений заголовочных файлов чтобы макрос определялся после разбора winnt.
Либо делать undef макросу C перед включением других заголовков.
Либо разделить исходный модуль на части, в которых не использовать одновременно оба заголовка.
Ну и, конечно, можно поправить код и избавится от макросов или хотя бы дать им более уникальные имена.
Re[2]: Проблема при компиляции с константами
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 22.07.15 14:24
Оценка:
Здравствуйте, watchmaker, Вы писали:

W>Здравствуйте, RussianFellow, Вы писали:


RF>>Как разрешить эту проблему? Можно ли её решить без переименования константы C в файле Defconst.h

W>Поменять порядок включений заголовочных файлов чтобы макрос определялся после разбора winnt.

Как это сделать? У меня нигде явно winnt.h в моём проекте Orbit не подключается. Но есть вкладка "Внешние зависимости", в которых перечислена куча системных .h-файлов, среди которых есть и winnt.h .

W>Либо делать undef макросу C перед включением других заголовков.


Можете привести пример, как это делается?
1613 г. = 2024 г.
Re[3]: Проблема при компиляции с константами
От: MTD https://github.com/mtrempoltsev
Дата: 22.07.15 14:44
Оценка:
Здравствуйте, RussianFellow, Вы писали:

W>>Либо делать undef макросу C перед включением других заголовков.


RF>Можете привести пример, как это делается?


#define XXX

....

#undef XXX
Re: Проблема при компиляции с константами
От: dead0k  
Дата: 22.07.15 14:55
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>#define C 299792.458


Экая прелесть!
А кто эту либу написал? Мне чтобы бежать сразу как встречу.
Re: Проблема при компиляции с константами
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 22.07.15 15:53
Оценка: +1
Здравствуйте, RussianFellow, Вы писали:

RF>Как разрешить эту проблему? Можно ли её решить без переименования константы C в файле Defconst.h -- например, что-то изменив в настройках Visual C++ ?

Константу запихай в namespace и назови const double C = xxx.xxx
Макросы для подобных вещей лучше не использовать.
Sic luceat lux!
Re[3]: Проблема при компиляции с константами
От: watchmaker  
Дата: 22.07.15 16:01
Оценка:
Здравствуйте, RussianFellow, Вы писали:

W>>Поменять порядок включений заголовочных файлов чтобы макрос определялся после разбора winnt.


RF>Как это сделать?

Поменять порядок строчек с #include.

RF>У меня нигде явно winnt.h в моём проекте Orbit не подключается.

Ну значит по зависимостям он подключается. Например, включение <windows.h> приведёт и к включению <winnt.h>.

Но по большому счёту тебе даже искать кто его включает не нужно — просто переставь свой проблемный Defconst.h в конец списка.

W>>Либо делать undef макросу C перед включением других заголовков.


RF>Можете привести пример, как это делается?


#undef C
Re[2]: Проблема при компиляции с константами
От: PM  
Дата: 22.07.15 20:26
Оценка: 9 (2) :)))
Здравствуйте, dead0k, Вы писали:

RF>>#define C 299792.458


D>Экая прелесть!

D>А кто эту либу написал? Мне чтобы бежать сразу как встречу.

Предупреждаю на всякий случай про #define I в стандартной библиотеке C

Defined in header <complex.h>
#define I /* unspecified */
(since C99)


И это еще считай повезло, что

The macro is not named i, which is the name of the imaginary unit in mathematics, because the name i was already used in many C programs, e.g. as a loop counter variable.



http://en.cppreference.com/w/c/numeric/complex/I
Re[3]: Проблема при компиляции с константами
От: _NN_ www.nemerleweb.com
Дата: 23.07.15 04:45
Оценка: +1
Здравствуйте, PM, Вы писали:

Не, ну конечно спасибо, что хотя бы не 'i'.
А чё.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Проблема при компиляции с константами
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 23.07.15 06:20
Оценка: :))
Проблема решена!

В проекте Orbit я в файле stdafx.h поместил заголовки системных .h-файлов, которые у меня используются, а в своих .cpp-файлах и .h-файлах я убрал заголовки этих системных файлов, оставив только #include "stdafx.h" .
И всё заработало!
1613 г. = 2024 г.
Re[3]: Проблема при компиляции с константами
От: dead0k  
Дата: 23.07.15 08:13
Оценка:
Здравствуйте, PM, Вы писали:

PM>Предупреждаю на всякий случай про #define I в стандартной библиотеке C


— Мать... мать... мать...- привычно отозвалось эхо...
Re[2]: Проблема при компиляции с константами
От: enji  
Дата: 23.07.15 08:40
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>И всё заработало!


Ты бы книжку какую-нить почитал по Си... А то учить его методом проб и ошибок задолбаешься
Re: Проблема при компиляции с константами
От: Кодт Россия  
Дата: 23.07.15 09:16
Оценка: +1
Здравствуйте, RussianFellow, Вы писали:

RF>На Visual C++ 2012 разрабатывается решение. В состав решения находится проект MathLib, в котором находятся файлы Types.h и Defconst.h . В файле Types.h определены типы ( например, typedef long double LDouble ), а в файле Defconst.h определены константы, в частности, определена константа


RF>#define C 299792.458


Если этот хедер для внутреннего пользования библиотекой, то на кой чёрт ты его включаешь к себе?
Если для внешнего, — на кой чёрт используешь эту библиотеку.

В любом случае, напиши автору библиотеки, что у него руки, как у осьминога — гибкие такие, подвижные, шаловливые, и растут из одного места.
Однобуквенные идентификаторы, даже если это Мировая Константа (в данном случае, судя по значению, это скорость света в СИ) — зло.

Пробегись тупой тотальной заменой исходников (или хотя бы хедеров) библиотеки C на CONST__LIGHTSPEED. Ибо нефиг. Компилятору всё равно, а ты же не будешь вычитывать формулы, которые лежат внутри библиотеки.
А для своих формул напиши хедер с текстом
namespace cosmology {
  const double c = CONST_LIGHTSPEED;
  const double G = CONST_GRAVITY;
  const double g = CONST_EARTH_GRAVITY;
  const double e = CONST_ELECTRON_CHARGE;
  const double h = CONST_PLANK;
  const double h_ = CONST_PLANK_STROKED;
  .....
}
Перекуём баги на фичи!
Re[4]: Проблема при компиляции с константами
От: PM  
Дата: 23.07.15 10:54
Оценка: +1
Здравствуйте, _NN_, Вы писали:

_NN>Не, ну конечно спасибо, что хотя бы не 'i'.

_NN>А чё.

Следует также отметить гуманность авторов библиотеки, которую использует топикстартер. А ведь могли сделать и #define c 299792.458 как это принятов в физике.
Re: Проблема при компиляции с константами
От: Nikita123 Россия  
Дата: 23.07.15 11:11
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>На Visual C++ 2012 разрабатывается решение. В состав решения находится проект MathLib, в котором находятся файлы Types.h и Defconst.h . В файле Types.h определены типы ( например, typedef long double LDouble ), а в файле Defconst.h определены константы, в частности, определена константа


RF>#define C 299792.458


RF>Также в этом решении есть проект Orbit, который использует эти два файла (Defconst.h и Orbit.h).


RF>То есть появляется конфликт имён--в файле winnt.h определено значение C со значением 1 как поле структуры DUMMYSTRUCTNAME, а в файле Defconst.h определена константа C со значением 2999792.458 .

RF>Как разрешить эту проблему? Можно ли её решить без переименования константы C в файле Defconst.h -- например, что-то изменив в настройках Visual C++ ?
Мне интересно кто или что мешает вам прочитать хотя бы одну книгу по языку С?
На русском языке издано уже много книг по языку С.
Учиться методом проб и ошибок — это тупиковый путь.
Желаю успеха,
Никита.
Re[2]: Проблема при компиляции с константами
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 23.07.15 13:27
Оценка:
Здравствуйте, Nikita123, Вы писали:

N>Здравствуйте, RussianFellow, Вы писали:


RF>>На Visual C++ 2012 разрабатывается решение. В состав решения находится проект MathLib, в котором находятся файлы Types.h и Defconst.h . В файле Types.h определены типы ( например, typedef long double LDouble ), а в файле Defconst.h определены константы, в частности, определена константа


RF>>#define C 299792.458


RF>>Также в этом решении есть проект Orbit, который использует эти два файла (Defconst.h и Orbit.h).


RF>>То есть появляется конфликт имён--в файле winnt.h определено значение C со значением 1 как поле структуры DUMMYSTRUCTNAME, а в файле Defconst.h определена константа C со значением 2999792.458 .

RF>>Как разрешить эту проблему? Можно ли её решить без переименования константы C в файле Defconst.h -- например, что-то изменив в настройках Visual C++ ?
N>Мне интересно кто или что мешает вам прочитать хотя бы одну книгу по языку С?
N>На русском языке издано уже много книг по языку С.
N>Учиться методом проб и ошибок — это тупиковый путь.

Я уже прочитал достаточно много книжек по C++.
Если что-то ещё читать--то только Страуструпа.
1613 г. = 2024 г.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.