Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Друг Кота
Аватара пользователя
Сообщения: 7083
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

когда с ЯВУ уходишь "вниз" там другие "звери" водятся :) врядли у меня лучше получится математику или ветвление с причудливым условием например развернуть чем у компилятора. да и если я выиграю по скорости выполнения кода, то уж точно проиграю в скорости его создания. :beer:
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Реклама
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Сообщение arkhnchul »

[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3352402#p3352402"]неумеренное его применение ведёт к снижению производительности[/uquote]
ну в вытесняющей ОС - не ведет) Хоть минуту пусть оно ждет в своей задаче, планировщик на это время не забудет про остальные.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7083
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

да, но тогда и сам делай может растянуться на неопределенное время (считает он только пока выполняется)
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Сообщение Siarzhuk »

[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3352590#p3352590"]делай может растянуться на неопределенное время (считает он только пока выполняется)[/uquote]
OS как правило предоставляют задачам свои собственные функции ожидания, входя в которые, задача отдаёт ресурсы МК на выполнение других задач. А для временно-критичных участков шедулер можно и остановить. И приоритет таких задач как правило ставится повыше.
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Реклама
Эиком - электронные компоненты и радиодетали
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18793
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

arkhnchul писал(а):Вам он не нравится только потому, что надо еще в ОС вкурить?
у меня всегда один и тот же принцип в программировании: стоит ли игра свеч?
то есть если я анализирую задачу и прихожу к выводу, что задача решается "тупо" - я тупо её и решаю. если оказывается, что тупое решение не приемлемо - я применяю более "умное". и так далее.

например, в винде многие вещи отлично делаются без использования многопоточности, но некоторые - хоть разбейся, без неё сделать невозможно. я имею ввиду, с сохранением юзабельности. и для меня нет никаких проблем создавать там отдельные потоки, синхронизировать обмен между ними и т.п.

до сих пор мне удавалось (или везло?) обходиться без выделения явных параллельных потоков (в том смысле, как это понимает ОСРВ или просто ОС) при разработке проектов на МК. при этом параллельно исполняющиеся задачи, разумеется, были, но делались они без лишних сущностей - прерывания и минимально необходимый автомат состояний. минимально необходимый - подчеркиваю.

попытки перевести мои проекты на OSA приводили меня к мысли, что игра свеч не стоит - т.е. сделать, конечно, можно, но затраты времени на переделку никак не окупаются для меня. вот я и не делал так.

например, мой последний проект - цифровая цветомузыка. не смотря на кажущуюся "многозадачность" (семплирование, FFT-анализ, обсчет алгоритмов "рисунка", вывод на светодиоды, обработка энкодера, вывод на ЖКИ в динамике и прием ИК-сигналов пульта) алгоритм у меня крайне ЛИНЕЙНЫЙ, и только прием ИК-сигналов сделан полностью в прерываниях. все остальные задачи выполняются последовательно, но дискретно, реализуя для себя простейший автомат состояния, как правило, состоящий из двух состояний: ожидание истечения счетчика и собственно выполнения полезной работы.

все в целом реализует принцип ОСРВ, т.е. гарантируется, что любая из задач обязательно получит управление снова ровно через 10 мс (если, конечно, не произойдут какие-то коллизии из-за ошибок программиста). и тем не менее никаких thread-ов, никакого шедулера и т.п. прибамбасов ОС у меня нет.

и неплохо все крутится. так зачем мудрить больше? :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Сообщение arkhnchul »

[uquote="ARV",url="/forum/viewtopic.php?p=3352660#p3352660"]в винде многие вещи отлично делаются без использования многопоточности[/uquote]
неверно. Строго говоря, ни одна вещь в оной винде не делается без многопоточности. Просто вы как само собой разумеющееся воспринимаете то, что ваша виндовая программа не захватывает себе монопольно вообще все ресурсы, это от вас прозрачно скрыто. Серьезно, когда вы в последний раз задумывались о том, что, к примеру, ожидание ввода с клавиатуры принадлежит не лично вам, а системе? Что это ожидание по неким событиям нужно захватывать и отдавать?
ARV писал(а):попытки перевести мои проекты на OSA приводили меня к мысли, что игра свеч не стоит
неверная постановка задачи. Перевод "один в один" уже готовой работающей системы на что угодно отличное от нее имеет мало смысла.
Представьте себе другой вариант: вы уже хорошо знакомы с той же OSA и вам вдруг надо сочинить некую систему, логически вполне неплохо представляемую тредами. Так почему бы и нет?
ARV писал(а):все в целом реализует принцип ОСРВ, т.е. гарантируется, что любая из задач обязательно получит управление снова ровно через 10 мс (если, конечно, не произойдут какие-то коллизии из-за ошибок программиста). и тем не менее никаких thread-ов, никакого шедулера и т.п. прибамбасов ОС у меня нет.
если первая часть высказывания верна, то вторая - не верна) Сотни и тысячи плагламистов в своей практике приходят к реализации частных случаев ОС на автоматах, сами о том не ведая.
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.

Сообщение da-nie »

да, но тогда и сам делай может растянуться на неопределенное время (считает он только пока выполняется)
В ОСРВ такого не может быть. delay там совсем не тупым циклом сделан. Однако, задержка будет чуть больше той, что вы ожидали (максимум на две величины системного тика в той же QNX). Также такие ОС предоставляют средства для избегания инверсии приоритетов потоков.
у меня всегда один и тот же принцип в программировании: стоит ли игра свеч?
Это абсолютно разумно. :beer: В 90% задач она только вредит и добавляет головной боли. Вот надо было мне три устройства по CAN опрашивать. Я каждому поток подарил. Потом к этим устройствам ещё по одному в комплекте дали. Сначала как независимое - я и им каждому поток подарил. А потом возжелали связать эти устройства между собой и второе стало зависимо от первого. Появился отдельный поток управления на каждую пару устройств, задающий другим потокам, чем именно занимается устройство в данный момент (те потоки так и работали - им ставили задачу и они её решали). Потом захотели перехват и запись данных от этих же устройств, но когда опрос ведёт третье лицо. Мда. Поэтому в новом приборе с подобными устройствами я уже точно знал, что в данном случае потоков должно быть два - интерфейсный и управляющий. При этом в управляющем нужно делать всё тупо, как в MS-DOS. :) Получилось гораздо более гибкая схема.
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18793
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

arkhnchul писал(а):Строго говоря, ни одна вещь в оной винде не делается без многопоточности.
я вел речь не о строгом функционировании программы в винде, а о том, как видит свою программу программист. например, когда надо читать файл, то его в 90% случаев можно читать "тупо", т.е. открыл и давай в буфер качать до конца. и ничего не произойдет такого, что могло бы встревожить... пока не заняться файлами в гигабайты :) а тут окажется, что такой файл читается, мягко говоря, долго, и интерфейс оконный в этот момент тормозит. и приходится думать о вынесении чтения файла в отдельный поток. вот что я имел ввиду, когда говорил, что говорил.
arkhnchul писал(а):Представьте себе другой вариант: вы уже хорошо знакомы с той же OSA и вам вдруг
зачем мне это представлять? последние сообщения в этом топике крутятся вокруг неуёмного желания ЛЮБУЮ задачу подогнать под многопоточное исполнение, при этом знакомства с ОС у автора нет. т.е. многопоточность принимается за некую априори правильную сущность, и уходить от нее нельзя. когда нужда заставляет делить задачу на потоки - это нормально, когда потоки выуждают программиста дробить задачу - это уже странновато. и моё сообщение именно об этом. все-таки не инструмент должен определять решение задачи, а под решение задачи разумно выбрать подходящий инструмент. во всяком случае, мне так кажется.
arkhnchul писал(а):если первая часть высказывания верна, то вторая - не верна)
удивительно, но вы абсолютно правы, и при этом я тоже абсолютно прав :) как вы назовете вот такую программу, многопоточной или однопоточной:

Код: Выделить всё

int main(void){
   init_all();
   while(1){
      workjob_1();
      workjob_2();
      workjob_3();
      synchronize();
   }
}
? ;)
каждая workjob-функция по сути задача, synchronize обеспечивает ТУПУЮ задержку главного цикла, если от момента предыдущего вызова этой функции прошло менее 10 мс, т.е. эта функция подгоняет длительность итерации главного цикла до 10 мс.

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

честно говоря, я слегка лукавлю, говоря что все очень просто :) например, обработка энкодра при таком подходе вышла у меня немного кривоватой - не хватило терпения доводить до разумно-красивого варианта. получилось несколько вложенных автоматов состояний, в общем, намудрил. и это неизбежное зло именно той самой асинхронности, которая вот так незримо присутствует в моей программе. т.е. решал бы я её средствами ОС, было бы то же самое, тот же гемор. возможно, просто более красиво вышло бы...

я все время хочу как-то осмысленно применять ОС, и подгоняю постепенно решения своих задач под эту парадигму. но почему-то всегда получается, что мои старания убеждают меня в обратном - не применять ОС :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

Сообщение baghear »

Добрый день, уже несколько раз сталкиваюсь с тем, что если изменить порядок подключения библиотек программа перестает компилироваться.
Подскажите пожалуйста, в какую сторону копать в этом случае. В этот раз потратил несколько часов пока дошел до того, что изменив порядок подключения инклудов программа начала нормально компилироваться.
Открыл глаза
Сообщения: 42
Зарегистрирован: Вс сен 03, 2017 19:43:57

Сообщение technik-1017 »

Это происходит из-за того что вы не подключаете заголовочный файлы (include), необходимые во вновь создаваемом файле.
Например, подключили в одном файле #include "test.h", а в следующем забыли или не стали, т.к. и так всё компилируется. Поменяли порядок компиляции файлов и получили ошибку компиляции. Нужно подключать все необходимые для данного файла другие заголовочные файлы. Если файлы используются во всех файлах (например stdint.h), то можно их прописать в файле main.c (компиляция, как правило начинается с него), либо создать отдельный файл с необходимыми #include и подключать его во всех файлах. Только необходимо, чтобы данный заголовочный файл обрабатывался один раз:
#ifndef TEST_H
#define TEST_H
Контактная информация:
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Сообщение Siarzhuk »

[uquote="baghear",url="/forum/viewtopic.php?p=3353898#p3353898"]сталкиваюсь с тем, что если изменить порядок подключения библиотек программа перестает компилироваться.Подскажите пожалуйста, в какую сторону копать в этом случае.[/uquote]
Изучать выхлоп препроцессора.
Кстати, в С/С++ под библиотеками понимаются уже скомпилированные модули и порядок их подключения задаётся скриптом компоновщика и влияет разве что в том паталогическом случае, когда в разных библиотеках определён одноимённый объект - будет использоваться первый найденный. Т.е. в вашем случае правильнее было сказать "порядок подключения заголовочных файлов", насколько я понял из последующей фразы.
[uquote="baghear",url="/forum/viewtopic.php?p=3353898#p3353898"]В этот раз потратил несколько часов пока дошел до того, что изменив порядок подключения инклудов программа начала нормально компилироваться.[/uquote]
С-модуль здорового человека первой директивой #include должен подключать свой собственный .h-файл. Это минимизирует зависимость от контекста включения последнего в других модулях проекта.

Добавлено after 18 minutes 42 seconds:
[uquote="technik-1017",url="/forum/viewtopic.php?p=3353966#p3353966"]Если файлы используются во всех файлах (например stdint.h), то можно их прописать в файле main.c (компиляция, как правило начинается с него)[/uquote]
Не поможет - всё включённое в main.c будет видно только при компиляции main.c и не видно при компиляции других модулей. Вариант с выделением стандартных заголовков в отдельный .h-файл имеет право на жизнь, более того рекомендуется если компилятор поддерживает т.н. precompiled headers, но для небольших проектов прямое включение в модуле стандартных заголовков позволяет иметь их всегда на виду и корректировать по мере необходимости. Например, заменив при доработке весь printf вывод в отдельном модуле на другие процедуры - идём вверх и сносим #include <stdio.h> нимало не заботясь как на это отреагируют другие модули проекта. Поскольку тенденция такова, что каждый разработчик со временем обрастает набором drop-in модулей для типовых решений, минимизация зависимости таких модулей от чего-то ещё кроме стандартной библиотеки - поможет экономить время.
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Открыл глаза
Сообщения: 42
Зарегистрирован: Вс сен 03, 2017 19:43:57

Сообщение technik-1017 »

[uquote="technik-1017",url="/forum/viewtopic.php?p=3353966#p3353966"]то можно их прописать в файле main.c (компиляция, как правило начинается с него)[/uquote]
Погорячился немного.
Также проверил, IAR компилирует файлы, в алфавитном порядке, причём последовательность скомпилированных файлов, раз от раза, может меняться (видимо многопоточность :) )
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

Сообщение baghear »

Это происходит из-за того что вы не подключаете заголовочный файлы (include), необходимые во вновь создаваемом файле.
Нет, с этим все нормально. Каждый модуль это отдельное творение, имеющее свой собственный хедер. И в данном случае в 3-ем модуле подключаю, хедеры от двух других.
Только необходимо, чтобы данный заголовочный файл обрабатывался один раз:
#ifndef TEST_H
#define TEST_H
Это тоже не обсуждается и не влияет на порядок файлов!!
Т.е. в вашем случае правильнее было сказать "порядок подключения заголовочных файлов", насколько я понял из последующей фразы.
Да.
-модуль здорового человека первой директивой #include должен подключать свой собственный .h-файл. Это минимизирует зависимость от контекста включения последнего в других модулях проекта.
Само собой!!мой наставник по Си говорил мне про это)))

У меня ситуация такая
хедер третьего модуля

Код: Выделить всё

#include "fft.h"
#include "UI.h"
#include "xpt2046_spi.h"

подключаемый хедер

Код: Выделить всё

#ifndef _FFT_H_
#define _FFT_H_

#include "ILI9341.h"
подключаемый хедер

Код: Выделить всё

#ifndef _UI_H_
#define _UI_H_

#include "ILI9341.h"
#include "enum.h"
В обоих подключается "ILI9341.h" может ли это как-то влиять?
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Сообщение Siarzhuk »

[uquote="baghear",url="/forum/viewtopic.php?p=3354022#p3354022"]В обоих подключается "ILI9341.h" может ли это как-то влиять?[/uquote]
Если header guard-ы (#ifndef/#define/#endif) прописаны то препроцессор вставит содержимое лишь при первом включении - для этого они и существуют. Если файлы включают друг друга - или напрямую или через третьи файлы - то "курица-яйцо" с вариантами и горе если первому нужно знать что-то из второго. а второму - из первого. Нарисуйте на листике граф #include-ов проекта, заметьте в каком месте ошибка, а в каком то определение, "невидимость" которого её вызывает. Сравните с выхлопом препроцессора. Но лучше потратить это время на рефакторинг проекта и сокращение количества связей между модулями.
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Опытный кот
Аватара пользователя
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

Сообщение baghear »

Не нашел пока причину и что интересно ошибки какие странные.

Код: Выделить всё

Build target 'Target 1'
compiling main.c...
E:\Keil_v5\ARM\PACK\ARM\CMSIS\5.2.0\CMSIS\Include\arm_math.h(6739): error:  #18: expected a ")"
    float32_t 
,
E:\Keil_v5\ARM\PACK\ARM\CMSIS\5.2.0\CMSIS\Include\arm_math.h(6737): error:  #141-D: unnamed prototyped parameters not allowed when body is present
    CMSIS_INLINE __STATIC_INLINE float32_t arm_bilinear_interp_f32(
E:\Keil_v5\ARM\PACK\ARM\CMSIS\5.2.0\CMSIS\Include\arm_math.h(6805): error:  #18: expected a ")"
    q31_t 
,
E:\Keil_v5\ARM\PACK\ARM\CMSIS\5.2.0\CMSIS\Include\arm_math.h(6803): error:  #141-D: unnamed prototyped parameters not allowed when body is present
    CMSIS_INLINE __STATIC_INLINE q31_t arm_bilinear_interp_q31(
E:\Keil_v5\ARM\PACK\ARM\CMSIS\5.2.0\CMSIS\Include\arm_math.h(6879): error:  #18: expected a ")"
    q31_t 
,
E:\Keil_v5\ARM\PACK\ARM\CMSIS\5.2.0\CMSIS\Include\arm_math.h(6877): error:  #141-D: unnamed prototyped parameters not allowed when body is present
    CMSIS_INLINE __STATIC_INLINE q15_t arm_bilinear_interp_q15(
E:\Keil_v5\ARM\PACK\ARM\CMSIS\5.2.0\CMSIS\Include\arm_math.h(6957): error:  #18: expected a ")"
    q31_t 
,
E:\Keil_v5\ARM\PACK\ARM\CMSIS\5.2.0\CMSIS\Include\arm_math.h(6955): error:  #141-D: unnamed prototyped parameters not allowed when body is present
    CMSIS_INLINE __STATIC_INLINE q7_t arm_bilinear_interp_q7(
main.c: 0 warnings, 8 errors
compiling dso.c...
E:\Keil_v5\ARM\PACK\ARM\CMSIS\5.2.0\CMSIS\Include\arm_math.h(6739): error:  #18: expected a ")"
    float32_t 
,
E:\Keil_v5\ARM\PACK\ARM\CMSIS\5.2.0\CMSIS\Include\arm_math.h(6737): error:  #141-D: unnamed prototyped parameters not allowed when body is present
    CMSIS_INLINE __STATIC_INLINE float32_t arm_bilinear_interp_f32(
E:\Keil_v5\ARM\PACK\ARM\CMSIS\5.2.0\CMSIS\Include\arm_math.h(6805): error:  #18: expected a ")"
    q31_t 
,
E:\Keil_v5\ARM\PACK\ARM\CMSIS\5.2.0\CMSIS\Include\arm_math.h(6803): error:  #141-D: unnamed prototyped parameters not allowed when body is present
    CMSIS_INLINE __STATIC_INLINE q31_t arm_bilinear_interp_q31(
E:\Keil_v5\ARM\PACK\ARM\CMSIS\5.2.0\CMSIS\Include\arm_math.h(6879): error:  #18: expected a ")"
    q31_t 
,
E:\Keil_v5\ARM\PACK\ARM\CMSIS\5.2.0\CMSIS\Include\arm_math.h(6877): error:  #141-D: unnamed prototyped parameters not allowed when body is present
    CMSIS_INLINE __STATIC_INLINE q15_t arm_bilinear_interp_q15(
E:\Keil_v5\ARM\PACK\ARM\CMSIS\5.2.0\CMSIS\Include\arm_math.h(6957): error:  #18: expected a ")"
    q31_t 
,
E:\Keil_v5\ARM\PACK\ARM\CMSIS\5.2.0\CMSIS\Include\arm_math.h(6955): error:  #141-D: unnamed prototyped parameters not allowed when body is present
    CMSIS_INLINE __STATIC_INLINE q7_t arm_bilinear_interp_q7(
Друг Кота
Аватара пользователя
Сообщения: 7383
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Сообщение uldemir »

возможно, у вас есть дефайн, совпадающий с именем или строкой в этом math.h и поэтому такое происходит. и он находится перед этим инклюдом
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Опытный кот
Аватара пользователя
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

Сообщение baghear »

Это похоже на правду

Код: Выделить всё

#ifndef _XPT2046_H_
#define _XPT2046_H_

#include "stm32f3xx.h"

#define CS_TOUCH_LOW   GPIOA->BRR |= GPIO_BRR_BR_4;		//PA4
#define CS_TOUCH_HIGH  GPIOA->BSRRL |= GPIO_BSRR_BS_4;

#define	Y 	0x90
#define	X 	0xD0
А X и Y в библиотеке math достаточно!!!Спасибо!!!

P.s в этом и была проблема, все заработало!!!
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

Код: Выделить всё

#define CS_TOUCH_LOW   GPIOA->BRR |= GPIO_BRR_BR_4;    
#define CS_TOUCH_HIGH  GPIOA->BSRRL |= GPIO_BSRR_BS_4;
Здесь в обоих строчках точка с запятой лишние, иногда приводит к таким труднонаходимым гадостям ...
Да и |= лишнее , достаточно = ...
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Сообщение pokk »

Здесь в обоих строчках точка с запятой лишние, иногда приводит к таким труднонаходимым гадостям ...
Можете привести примеры гадостей ? Все время в define ставлю точку с запятой, и как-то ещё не разу не нарвался.
Друг Кота
Аватара пользователя
Сообщения: 7083
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

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

Добавлено after 3 minutes 4 seconds:
пример (правда не очень яркий): if (условие) дефайн_1 else дефайн_2;
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Ответить

Вернуться в «Разные вопросы по МК»