gpt4 book ai didi

c - 如何让 Emacs 正确处理 C 预处理器条件

转载 作者:太空狗 更新时间:2023-10-29 15:06:19 26 4
gpt4 key购买 nike

我有一个性能敏感的 CUDA 代码,我正在使用它

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

...用于封装速度瘫痪的调试代码的条件,它从 GPU 获取额外信息。

#else 之前,emacs (Centos 6.0) 一切正常。

这会缩进(1 个制表符)预处理器条件的 else 子句内的文本,并继续缩进之后的所有内容。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~注意:) 预处理器条件中的复制似乎由 C 模式正确处理。但是 ); 重复会破坏事情,迫使你将 ); 移到条件之外......哦,天哪,多么不一致。在我们获得正确的 elisp 代码来修复这种不一致之前,我会一直悬而未决这个问题。~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

当前答案的注释:
Jens提供了不准确的信息,声称在条件语句中缩进嵌套的 ) 是“不可能的”。这不仅是可能的,而且 Emacs 的 C-Mode 主动地做到了这一点。请注意此问题帖子末尾示例 c 程序的正确缩进以证明这一点。因此,); 缩进也是可行的,尽管出于 Jens 概述的原因应谨慎行事。 .

无论如何,我想确保人们看到那个陈述是不正确的,所以他们不会认为这个问题是无法回答的。当 Jens 修改他的不准确陈述以反射(reflect)它是可能的时,我将删除此评论和我对他的帖子的反对票,对于他概述的 ) 的情况,它是在 C 模式下实现的,但不是推荐。

目前我正在诉诸手动重新调整一个选项卡的间距,但它浪费了很多时间(代码很长)。

知道我可以在我的 ~/.emacs 文件中添加什么来解决这个问题吗???

提前致谢!

编辑 1我应该提到它似乎令人窒息的子句是一个函数关闭,例如

      MyFunc<<<Blk,Thr>>>(Stuff1,
#ifdef DEBUG_FUNC1
Stuff2,
dev_Debug);
#else
Stuff2); //Deindents here.
#endif
//Everything here on out is deindented.

这可能是那种代码结构的特定故障...

编辑 2这是一个简单的 C 代码版本...代码按预期工作,但不是最后一个 #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
);

或者您应该有两个完整的原型(prototype)版本,它们是根据您的调试宏选择的。不仅对于 emacs(或者可能任何其他编辑器)来说,其他任何东西都难以解析,而且对于追随你的可怜人来说也是如此。

你想要的是不可能的,因为代码的缩进级别可能取决于宏:

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

其中 AB 对于所有有效编译都是相同的。如果不假设 AB 的值,Emacs 无法知道如何缩进。

关于c - 如何让 Emacs 正确处理 C 预处理器条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9630213/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com