Отступ Emacs после макроса в C

#define INIT_MACRO create(); some(); enviroment();
...
void function(){
  INIT_MACRO
    extra_indented();
  normal_indented();
}

как мне заставить emacs правильно справиться с вышеуказанной ситуацией, когда он запрашивает автоматический отступ?

РЕДАКТИРОВАТЬ единственное решение, которое я вижу, - сказать emacs, что нужно обрабатывать строки, содержащие только заглавные буквы, подчеркивания и пробелы, как если бы они имели точку с запятой в конце... но как бы я это сделал?

4 ответа

Решение

Это работает:

#define INIT_MACRO do { create(); some(); enviroment(); } while (0)
...
void function(){
  INIT_MACRO;
  extra_indented();
  normal_indented();
}

Обычно лучше использовать этот трюк, чтобы избежать проблем при использовании:

if (...)
  MACRO();
else
  ...

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

cc-mode имеет этот настраиваемый через c-macro-names-with-semicolon переменная. Смотрите документацию для получения дополнительной информации.

Почему бы вам просто не завершить строку INIT_MACRO символом?

Использование макроса в качестве обёртки функции без (); в конце, когда вы называете это и без окружения определить с do { а также } while(0) в любом случае это не делается... делает код уродливым, сложным в обслуживании и не поддерживается одним стандартом кодирования C... другими словами, это называется кодом кровоточащего глаза. Так что это невозможно с настройками по умолчанию.

Вы должны будете сделать свой собственный основной / второстепенный режим. Для поддержки этого нового типа синтаксиса... Или вы можете взглянуть на ваш текущий cc-mode.el.

Другие вопросы по тегам