2012-03-09 72 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