如何获得Emacs的妥善处理C预处理器
我有一个性能敏感的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子句......
我认为问题是在你的代码的逻辑。从逻辑上讲,你在函数参数列表中有不同的参数。右括号不应该是条件的一部分。
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
的值,如何缩进。
我的代码在语法上是正确的,并且编译...它可能是不好的形式,但是我在每个关闭的arg集上包含一个''; cap。如果没有把它变成关于编码标准的争论,为什么elisp在语法上是正确的时候不能处理它。 – 2012-03-09 07:28:15
如果您不相信我的语法工作,请参阅上面的简单C示例。现在,你的解决方案确实有效,但我想尝试得到一个答案,为什么emacs c处理程序会破坏我的选择,但是有效的语法以及如何防止...直到我得到答案时,这个问题仍然是开放的原则,但是我将您的解决方案用作解决方案,因此我对您进行了评级。 ;) – 2012-03-09 07:30:41
@Jason,因为elisp是lisp。它的解析器非常依赖于扫描右括号(广义上)。 C是不同的,它分阶段地解析代码并且语法替换(或消除)文本的部分。不知何故,您想要为预处理器宏的任何可能值标识代码。对于给定的blob,不能保证以这种方式计算的缩进甚至是独一无二的。 – 2012-03-09 07:35:21
如果你计算'#ifdef'和'#else'之间的代码中的开始和结束括号('{}')的数量,它们全部匹配吗? – 2012-03-09 07:12:37
请参阅示例...在预处理器部分中没有{} ...,它正在窒息。它似乎不喜欢我在函数调用中使用其他预处理器。发布非CUDA示例,以便我可以展示我的意思...... – 2012-03-09 07:22:43
考虑在每个分支中放置更多(例如,如果需要,请使用重复定义)。我怀疑这是由于第一条路上的“)”造成的。 – 2012-03-09 07:23:04