Отступ Emacs после макроса в C - PullRequest
4 голосов
/ 12 июля 2011
#define INIT_MACRO create(); some(); enviroment();
...
void function(){
  INIT_MACRO
    extra_indented();
  normal_indented();
}

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

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

Ответы [ 4 ]

10 голосов
/ 12 июля 2011

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

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

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

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

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

4 голосов
/ 13 мая 2013

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

1 голос
/ 12 июля 2011

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

0 голосов
/ 12 июля 2011

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

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

...