Как заставить Emacs правильно обрабатывать условия препроцессора C

У меня есть чувствительный к производительности код CUDA, который я использую

#ifdef DEBUG_<NAME_OF_SECTION>
   ...
#else
   ...
#endif

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

В emacs (Centos 6.0) все идет хорошо до #else.

Это отменяет отступ (на 1 табуляцию) текста внутри предложения else препроцессорного условного оператора и продолжает отменять отступ для всего впоследствии.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Примечание: ) репликация внутри условных выражений препроцессора, похоже, правильно обрабатывается C-режимом. Но ); дублирование ломает вещи, заставляя вас перемещать ); за пределы условного... боже мой, как непоследовательно. Я оставлю этот вопрос открытым, пока мы не получим правильный код elisp для исправления этого несоответствия.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

ПРИМЕЧАНИЕ по текущему ответу:
Йенс предоставил неточную информацию информация в утверждении, что отступ, вложенный ) внутри условных выражений, «невозможен». Это не только возможно, но и Emacs C-Mode активно делает это. Обратите внимание на правильный отступ примера программы c в конце этого сообщения с вопросом для доказательства этого. Таким образом, логично предположить, что ); также можно сделать отступ, хотя следует соблюдать осторожность по причинам, изложенным Йенсом.

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

В настоящее время я прибегаю к ручному перемещению вещей вперед на одну вкладку, но это тратит много времени (код длинный).

Есть идеи, что я могу добавить в свой файл ~/.emacs, чтобы исправить это???

Заранее спасибо!

РЕДАКТИРОВАТЬ 1 Я должен упомянуть, что предложение, которое, кажется, задыхается, является закрытием функции, например.

      MyFunc<<<Blk,Thr>>>(Stuff1,
  #ifdef DEBUG_FUNC1
                          Stuff2,
                          dev_Debug);
  #else
                       Stuff2); //Deindents here.
  #endif
  //Everything here on out is deindented.

Это может быть конкретный сбой в такой структуре кода...

РЕДАКТИРОВАТЬ 2 Вот простая версия кода C... код работает, как и ожидалось, но не соответствует последнему предложению #else...

#include <stdio.h>

//#define DEBUG

void printer
(int A,
#ifdef DEBUG
 int B,
 int C)
#else
 int B)
#endif
{
#ifdef DEBUG
   printf("A: %i, B: %i, C: %i\n", A, B, C);
#else
   printf("A: %i, B: %i\n", A, B);
#endif
}

int main()
{
   int A = -3;
   int B = 1;
   int C = 3;
   printer(A,
#ifdef DEBUG
       B,
       C);
#else
   B);
#endif
   return 0;
}

... это похоже на то, что я делаю .Я знаю, что это синтаксически работает в C (или, по крайней мере, я думаю, что работает... он дает правильные результаты), однако emacs не любит это предложение #else внутри вызова функции....

5
задан Community 23 May 2017 в 11:55
поделиться