【问题标题】:Adding some comments to the C/C++ header file automatically or manually自动或手动向 C/C++ 头文件添加一些注释
【发布时间】:2010-09-01 20:22:18
【问题描述】:

我一直在头文件中添加以下预处理器代码。

#ifdef _HELLO_H_ #define _HELLO_H_ #万一

有没有办法自动(我的意思是,当我第一次加载头文件时,emacs 只是添加代码)或手动(我的意思是,我有一些 M-x SOMETHING)?

如果不存在,我该如何编写 elisp 代码呢?

  • 检查#ifdef 是否未定义。
  • 将名称 _HELLO_H_ 取自头文件的名称。

【问题讨论】:

  • 旁注:以下划线开头的标识符是保留的(一种或另一种方式)。你应该使用类似#define HELLO_H_INCLUDED
  • +1, _MACROS 对于用户代码是非法的。

标签: c++ emacs elisp code-templates


【解决方案1】:

我使用YaSnippet,效果很好。它默认带有许多适用于不同语言和模式的 sn-ps,不仅适用于 C++。另外,您可以编写自己的模板 (sn-ps),甚至在其中使用 Lisp(即生成带有版权信息的文件头,包括当前年份)。还有一个不错的documentation

这是一个“once” sn-p 的示例,当您在 cc-mode 中键入“once”并点击“tab”按钮时,它会被展开:

#name : #ifndef XXX; #define XXX; #endif
# --
#ifndef ${1:_`(upcase (file-name-nondirectory (file-name-sans-extension (buffer-file-name))))`_H_}
#define $1

$0

#endif

这是我的“许可证”sn-p for c++-mode,它添加了当前年份的版权信息:

#name : C++ source file license
# --
//
// Copyright (C) `(format-time-string "%Y" (current-time))` Bueller? Bueller?
//
// $Id$
//

【讨论】:

  • YASnippet 是一个很棒的工具,但是为了这个目的它是错误的,它是 templates
  • @Cheeso:这是有争议的。 sn -p 模板和函数中描述的模板有什么区别?
【解决方案2】:

我会看看Skeleton Mode

【讨论】:

    【解决方案3】:

    如果您使用的是 Emacs 23.2,或者安装了 CEDET,您可以使用 SRecode。如果global-srecode-minor-mode 已打开,您可以使用C-c / / 插入预定义模板之一。默认情况下,在一个空的 .h 文件中,它将提供空模板并插入文本,就像您在上面显示的那样。由于 SRecode 具有分层模板,您可以通过立即从菜单中选择“编辑模板”并将其复制到您的~/.srecode 目录中的模板文件(如mytemplates.srt)来轻松覆盖它的功能。使用与上述相同的空模板插入技术来启动新的模板文件。

    如果您想要插入复杂的代码模式,SRecode 非常好,因为它具有用于组合和重用模板的丰富语言,这使得使用语义标签生成代码或构建代码生成应用程序变得容易。

    如果您喜欢将模板插入作为一种编码模式,例如快速插入 if{} 块等,我不得不推荐 yasn-p,因为它具有更好的 UI。

    【讨论】:

      【解决方案4】:

      我使用模板,然后全局替换文本:

      #ifndef STENCIL_HPP
      #define STENCIL_HPP
      
      class Stencil
      {
      };
      
      #endif // STENCIL_HPP
      

      Emacs 和 Xemacs 具有智能文本替换功能,因此“Stencil”将替换为“Square”而不是“SQUARE”。

      【讨论】:

      • 这是 defaultcontent.el 自动执行的操作。
      【解决方案5】:

      大多数现代编译器支持#pragma once,但 YMMV。在你的编译器中试试(我猜你使用 emacs 是 gcc,它已经支持了很长一段时间了,至少从 2.95 版开始,可能更早。)

      Visual Studio 也肯定支持它,我想是 MS 发起了约定。

      【讨论】:

      • #pragma once 有时只是不起作用。例如,当标头被复制为某些安装脚本的一部分时(make install?)并且由于包含路径中的某些错误(例如曾经将其包含为“mylib/header.h”而另一次就像“标头”一样。H”)。另外,不要忘记一些不能正确处理硬链接的错误编译器。另外,这不是标准的一部分。
      【解决方案6】:

      YASnippet 很酷,我使用它,但它不适合这项工作。

      这个问题的解决方案是使用模板框架。在 emacs 中有几个。我不记得我在设置defaultcontent.el 之前评估的所有模板系统。它基本上是一种自动执行Thomas Matthews' approach 的方式。

      我尝试了 SkeletonMode,但觉得它太不模板化而不能成为模板包。使用 defaultcontent.el,我在模板文件中为每种文件类型定义模板。没有必要省略。

      YASnippet 呢?它用于嵌入代码的 sn-ps - 在模块中出现 1-n 次的东西。示例:for 循环、方法定义、类定义、案例语句。相比之下,文件模板每次都包含进入每个文件的内容。 sn-p 是我选择添加或不添加到文件中的内容,具体取决于编码要求。

      【讨论】:

        【解决方案7】:

        M-x auto-insert

        完全按照您的要求进行操作,并将其作为标准内置在 emacs 中

        只需打开头文件并运行命令

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-05-25
          • 2021-03-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-24
          相关资源
          最近更新 更多