Как заставить Emacs правильно обрабатывать условия препроцессора C - PullRequest
5 голосов
/ 09 марта 2012

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

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

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

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

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

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

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

Во всяком случае, я хочу убедиться, что люди видят, что это утверждение неверно, поэтому они не считают этот вопрос без ответа. Я удалю этот комментарий и мое понижение на пост Дженса, когда он исправит свои неточные утверждения, чтобы отразить, что это возможно, реализован в 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 внутри вызова функции ....

1 Ответ

3 голосов
/ 09 марта 2012

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

 MyFunc<<<Blk,Thr>>>(
                      Stuff1,
 #ifdef DEBUG_FUNC1
                      Stuff2,
                      dev_Debug
 #else
                      Stuff2
 #endif
                      );

Или же у вас должны быть две полные версии прототипа, выбранные в соответствии с вашим макросом отладки.Все остальное трудно анализировать не только для emacs (или, возможно, любого другого редактора), но и для бедного человека, который идет за вами.

То, что вы хотите, невозможно, поскольку уровень отступа кода может зависетьмакросы:

#if A
(
#endif
something
#if B
)
#endif

, где A и B одинаковы для всех допустимых компиляций.Emacs не может знать, не принимая значения для A и B, как сделать отступ.

...