我有一個性能敏感的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子句......
如果你計算'#ifdef'和'#else'之間的代碼中的開始和結束括號('{}')的數量,它們全部匹配嗎? – 2012-03-09 07:12:37
請參閱示例...在預處理器部分中沒有{} ...,它正在窒息。它似乎不喜歡我在函數調用中使用其他預處理器。發佈非CUDA示例,以便我可以展示我的意思...... – 2012-03-09 07:22:43
考慮在每個分支中放置更多(例如,如果需要,請使用重複定義)。我懷疑這是由於第一條路上的「)」造成的。 – 2012-03-09 07:23:04