我有一个性能敏感的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