edit: Заголовок, вероятно, должен быть "Препроцессор, вопрос преобразования компилятора CPP в C. Как мне стало известно, препроцессоры одинаковы. Мне кажется, что проблема в том, что результаткомпилируемый предварительно обработанный код, CPP более доволен компоновкой по сравнению с компилятором C.
Любой совет, как мне сделать это совместимым с препроцессором C? Я пытался сделать изящный способ созданиягибкий оператор переключения для конечного автомата, который вызывается при возникновении определенных событий и продвигается при выполнении определенных критериев. Как только он достигает конца оператора переключения, он сигнализирует, что конечный автомат завершил работу, возвращая значение true. Я хотел иметь возможность Поменяйте / вставьте шаги без необходимости заново назначать значения регистра , так что это то, что я придумал в CPP, который работает очень хорошо.
#include <iostream>
#include <thread>
#define DYNCOUNT(start) (__COUNTER__-start)
#define DYNAMIC_SWITCH_BEGIN(identifier,switchElement) \
const unsigned int identifier = __COUNTER__; \
switch(switchElement){ \
case 0:
#define DYNAMIC_SWITCH_ELM(identifier) \
break; \
case DYNCOUNT(identifier):
#define DYNAMIC_SWITCH_END \
break; \
};
bool stateMachine(unsigned int & state) {
DYNAMIC_SWITCH_BEGIN(ident, state)
std::cout << "A" << std::endl;
//if(some_condition){
state++;
//}
DYNAMIC_SWITCH_ELM(ident)
std::cout << "B" << std::endl;
//if(some_condition){
state++;
//}
DYNAMIC_SWITCH_ELM(ident)
std::cout << "C" << std::endl;
//if(some_condition){
state++;
//}
DYNAMIC_SWITCH_ELM(ident)
std::cout << "D" << std::endl;
//if(some_condition){
state++;
//}
DYNAMIC_SWITCH_ELM(ident)
std::cout << "E" << std::endl;
//if(some_condition){
state++;
//}
DYNAMIC_SWITCH_ELM(ident)
std::cout << "F" << std::endl;
//if(some_condition){
state++;
//}
DYNAMIC_SWITCH_ELM(ident)
std::cout << "G" << std::endl;
//if(some_condition){
state++;
//}
break;
default:
return true;
DYNAMIC_SWITCH_END
return false;
//Visual Studios gets confused with the layout and structures it with this tabulation.
}
int main() {
unsigned int machineState=0;
while(!stateMachine(machineState)){/*other operations*/}
std::this_thread::sleep_for(std::chrono::seconds(5));
return 0;
}
Однако, когда я пытаюсь запустить его всреда C через MPLAB я получаю:
stateMachines.c: 28: 9: ошибка: метка случая не повторяетсяиз-за целочисленной константы DYNAMIC_SWITCH_ELM (идент.)
Таким образом, кажется, что препроцессор CPP желает интерпретировать значение const unsigned int в свои команды, в то время как препроцессор C или, по крайней мере, препроцессор C MPLAB, делаетнет.
Моя единственная альтернатива - обрезать часть содержимого вызова DYNAMIC_SWITCH_BEGIN и вместо этого поместить
#define ident __COUNT__
в начале коммутатора.Это тоже работает, но я пытался получить более строгую структуру структуры.