2012-03-09 76 views
5

我有一個性能敏感的CUDA代碼,我使用如何獲得Emacs的妥善處理C預處理器

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

...條件語句,其封裝速度,削弱調試代碼,它抓住了額外的信息關閉GPU。

在emacs(Centos 6.0)中一切順利,直到#else

此預取處理程序的else子句中的文本(由1個選項卡)有條件並繼續對所有事件進行後續處理。

~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 注: )預處理條件內複製似乎是由C模式妥善處理。但);重複打破的東西,迫使你移動條件以外的); ...哦親愛的有多麼不一致。我保持這個問題是開放的,直到我們獲得正確的elisp代碼來解決這種不一致。 35~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~目前的答案

注:
Jens提供聲稱在內部條件中嵌套)是不可能的信息是「不可能的」。這不僅是可能的,但Emacs的C模式積極做到這一點。請注意本問題末尾示例c程序的正確縮進,以證明這一點。所以可以這樣說,);也可以縮進,但應該注意Jens列出的原因。

無論如何,我想確保人們看到該聲明是不正確的,所以他們不認爲這個問題是無法回答的。我將刪除此評論,並在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. 

這可能是對那種代碼結構的具體故障...

EDIT 2 這裏有一個簡單的C代碼版本...代碼工作正常,但不是deindent在最後#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子句......

+0

如果你計算'#ifdef'和'#else'之間的代碼中的開始和結束括號('{}')的數量,它們全部匹配嗎? – 2012-03-09 07:12:37

+0

請參閱示例...在預處理器部分中沒有{} ...,它正在窒息。它似乎不喜歡我在函數調用中使用其他預處理器。發佈非CUDA示例,以便我可以展示我的意思...... – 2012-03-09 07:22:43

+1

考慮在每個分支中放置更多(例如,如果需要,請使用重複定義)。我懷疑這是由於第一條路上的「)」造成的。 – 2012-03-09 07:23:04

回答

3

我認爲問題是在你的代碼的邏輯。從邏輯上講,你在函數參數列表中有不同的參數。右括號不應該是條件的一部分。

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

或者,您應該根據您的調試宏選擇原型的兩個完整版本。換句話說,不僅難以解析emacs(或者其他任何編輯器),而且也爲你後面的可憐人類解析。

你想要什麼是不可能的,因爲一個代碼的縮進級別可能取決於宏:

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

其中AB是所有有效編譯相同。如果Emacs不知道AB的值,如何縮進。

+0

我的代碼在語法上是正確的,並且編譯...它可能是不好的形式,但是我在每個關閉的arg集上包含一個''; cap。如果沒有把它變成關於編碼標準的爭論,爲什麼elisp在語法上是正確的時候不能處理它。 – 2012-03-09 07:28:15

+0

如果您不相信我的語法工作,請參閱上面的簡單C示例。現在,你的解決方案確實有效,但我想嘗試得到一個答案,爲什麼emacs c處理程序會破壞我的選擇,但是有效的語法以及如何防止...直到我得到答案時,這個問題仍然是開放的原則,但是我將您的解決方案用作解決方案,因此我對您進行了評級。 ;) – 2012-03-09 07:30:41

+0

@Jason,因爲elisp是lisp。它的解析器非常依賴於掃描右括號(廣義上)。 C是不同的,它分階段地解析代碼並且語法替換(或消除)文本的部分。不知何故,您想要爲預處理器宏的任何可能值標識代碼。對於給定的blob,不能保證以這種方式計算的縮進甚至是獨一無二的。 – 2012-03-09 07:35:21