Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
 Аватар для gromo
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225

Preprocessing evaluation order

05.03.2016, 02:37. Показов 2221. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Известно ли в каком порядке препроцессор обрабатывает файлы проекта?
Из случая, который со мной сегодня приключился, выходит, что нет.

Попалась некоторая библиотека, в которой базовый класс определялся препроцессорной константой:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* lib.hpp */
#define ABSTRACT_BASE Base // default value
class Concrete : public ABSTRACT_BASE { . . .};
 
/* lib.cpp */
#include "lib.hpp"
Concrete::Concrete() : ABSTRACT_BASE(this) { . . .}
 
/* main.cpp */
// You can specify the base class by placing
// preprocessor's define here before including 
// library header.
 
#define ABSTRACT_BASE AnotherBase
#include "lib.hpp"
 
auto main() -> int
{
    Concrete c; // the Base (!) subclass
}
Около 2 часов ушло на то, чтобы выявить проблему и придумать какое-нибудь ей объяснение
Получается в lib.cpp сгенерировался один класс, a в main.cpp уже другой. Понятия не имею как оно слинковалось потом
Верны ли мои домыслы, что порядок препроцессирования также не определен как и порядок раздельной компиляци исходников? При довольно беглом гуглении не нашел подходящих ответов...
Спасибо!
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.03.2016, 02:37
Ответы с готовыми решениями:

Order of evaluation
Всем привет. Никак не могу побороть Order of evaluation. В статье на cppreference, приводятся примеры UB и уже на первом я застреваю и не...

HSQL запрос. Что не так? "from hiberdata.Order order where order.clientId=?"
public List loadOrdersByClientId(Integer clientId) { return getHibernateTemplate().find( 'from hiberdata.Order order where...

Исправить ошибки Error: nvalid preprocessing directive #std
#include <stdio.h> #define SIZE 18 void search(int , int); void MaxMin(int , int); void increase(int , int); main() { ...

21
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
06.03.2016, 03:45
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от hoggy Посмотреть сообщение
данное предупреждение - услуга компилятора,
которую он оказывает исключительно,
если ему посетили правильные ключики.
так то вообще, он не обязан этого делать.
Обязан.
The set of diagnosable rules consists of all syntactic and semantic rules in this International Standard except for those rules containing an explicit notation that “no diagnostic is required” or which are described as resulting in “undefined behavior.
...
If a program contains a violation of any diagnosable rule or an occurrence of a construct described in this Standard as “conditionally-supported” when the implementation does not support that construct, a conforming implementation shall issue at least one diagnostic message.
...
A conforming implementation may have extensions (including additional library functions), provided they do
not alter the behavior of any well-formed program. Implementations are required to diagnose programs that
use such extensions that are ill-formed according to this International Standard. Having done so, however,
they can compile and execute such programs.
Цитата Сообщение от hoggy Посмотреть сообщение
выше я привел вам кусок кода,
который успешно собирается 3мя топовыми компиляторами без единой ошибки,
или предупреждения.
http://rextester.com/LIGS18774
Тебя rextester ввел в заблуждение. Его галка Show Compiler Warnings никак не влияет на аргументы командной строки и выхлоп самого компилятора, это лишь настройка самого сайта. Можешь убедиться в этом, посмотрев на Compiler args.
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13241 / 6873 / 1827
Регистрация: 18.10.2014
Сообщений: 17,420
06.03.2016, 05:08
Цитата Сообщение от hoggy Посмотреть сообщение
стандарт вообще ничего не запрещает.
Не надо придираться к словам. Тут все прекрасно понимают, что слово "запрещает" в моем сообщении говорит лишь о легальности кода, а не том, что в стандарте якобы будет написано "нельзя, а то в тюрьму посажу".

Цитата Сообщение от hoggy Посмотреть сообщение
стандарт не запрещает собирать ill-formed.
Хорошо, что вы усвоили сказанною мною ранее.

Стандарт не запрещает компиляторам С++ и Фортран с Бейсиком компилировать, если компилятор не забудет выдать диагностическое сообщение. Но мы тут говорим именно о языке С++ и программах на С++. Ill-formed программы, как и программы на Фортране и Бейсике, программами на С++ не являются и нам в данный момент не интересны.

Цитата Сообщение от hoggy Посмотреть сообщение
этот код абсолютно легальный:

http://rextester.com/LIGS18774
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
 
#define ololo 1
#define ololo 2
 
int main()
{
    std::cout << "Hello, world!" << ololo << std::endl;
}
Нет. Это уже бред полнейший. Этот код является нелегальным (ill-formed) в С++, так как грубо и прямо нарушает требования пункта 16.3/2 стандарта языка С++ (он здесь уже цитировался).

Использовавшийся вами компилятор, в полном соответствии с требованиями стандарта языка, выдал диагностическое сообщение на эту ошибку. Вы его, разумеется, не увидели, потому что забыли отключить фильтрацию диагностических сообщений в онлайн-компиляторе

Цитата Сообщение от hoggy Посмотреть сообщение
его скомпиляют все топовые компиляторы:
и жосиси, и кл, и шланг.
Вы запутались. Все топовые компиляторы выдадут диагностические сообщения на это код из-за его нелегальности. А "скомпилируют" ли они его потом - никакого значение не имеет и рамках данной темы никому не интересно.

Еще раз повторю, что этот код является нелегальным в С++, так как грубо и прямо нарушает требования пункта 16.3/2 стандарта языка С++. Все, что я могу вам предложить, это постараться уяснить этот простой факт.

И, чтобы избегать подобных конфузов с "скомпиляют все топовые компиляторы" в будущем, постарайтесь запомнить, что если вы собираетесь использовать такие "топовые компиляторы" как GCC и clang для проверки легальности кода, вам придется указывать флаг -pedantic-errors. Пока вы не умеете самостоятельно отличать "невинные" предупреждения от "серьезных" предупреждений, вызванных ошибками в коде, это флаг вам в этом сильно поможет. Флаг -pedantic-errors был введен в эти компиляторы специально для того, чтобы рапортовать нелегальный код через errors, а не через warnings.

Цитата Сообщение от hoggy Посмотреть сообщение
ничего подобного.
данное предупреждение - услуга компилятора,
которую он оказывает исключительно,
если ему посетили правильные ключики.
так то вообще, он не обязан этого делать.
Это полная белиберда. Данное предупреждение является диагностическим сообщением, выдача которого является безусловным требованием стандарта языка. Любой компилятор языка С++ обязан выдавать такое сообщение, если он хочет называться компилятором языка С++.

Цитата Сообщение от hoggy Посмотреть сообщение
выше я привел вам кусок кода,
который успешно собирается 3мя топовыми компиляторами без единой ошибки,
или предупреждения.
Что? "Без единой ошибки, или предупреждения." Вы людей за дурачков, что-ли считаете? Вы же сами отфильтровали предупреждения, выключив опцию "Show compiler warnings"

(И еще раз: пока вы не научитесь самостоятельно анализировать степень серьезности диагностических сообщений, вам придется использовать флаг -pedantic-errors в GCC и clang. Без этого флага ваши экзерсисы с компиляторами и вытекающие из этого разглагольствования будут иметь разве что юмористическую ценность.)

Напоследок, для вашего кода

http://coliru.stacked-crooked.... 1f7b3a775c

g++ -std=c++14 -pedantic-errors main.cpp && ./a.out
main.cpp:4:0: error: "ololo" redefined
#define ololo 2
^
main.cpp:3:0: note: this is the location of the previous definition
#define ololo 1
^
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.03.2016, 05:08

Function evaluation timed out
IEnumerable&lt;Market&gt; allMarkets = getAllMarkets();//count ~= 450 IEnumerable&lt;int&gt; neededIds = new int {164633}; IEnumerable&lt;Market&gt;...

Order by внутри order by
Добрый день, есть условно таблица с пользователями, у которых есть несколько сообщений, хранящихся в другой таблице user: id...

STM32 comStick Evaluation Board
Так и быть, расскажу, чего сейчас ковыряю :) Был на последней выставке в Нюрнберге Embeddid World. Там по работе подходил к стенду ST...

CodeVisionAVR Evaluation V2.05.3a выдает ошибку
При построении hex-файла выдает ошибку &quot;Error(s) occured during assembly&quot; Подскажите начинающему!!! Заранее благодарен.

Чем отличается Windows 8.1 Enterprise Evaluation?
На официальном сайте Microsoft technet.com нельзя скачать обычную Windows 8.1 Enterprise, а только Windows 8.1 Enterprise Evaluation....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
22
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru