如何更改C ++包括CLION的守卫?

时间:2016-04-21 11:05:58

标签: c++ clion include-guards

当CLion创建一个头文件时,它会添加包含这样的保护字符串:

#ifndef PROJECTNAME_FILENAME_H
#define PROJECTNAME_FILENAME_H

/* ... code ... */

#endif //PROJECTNAME_FILENAME_H

但我只想FILENAME_H而没有PROJECTNAME_前缀。如何在CLION设置中更改它?

4 个答案:

答案 0 :(得分:7)

  1. 设置 - >编辑器 - >文件和代码模板 - >文件
  2. ${INCLUDE_GUARD}更改为_${NAME}_H_
  3. 例如,如果您的文件名为:clion.h,那么_${NAME}_H_将呈现为_clion_H_,因为${NAME}将呈现为文件名(不带扩展名)。< / p>

答案 1 :(得分:6)

这个问题迟到了,但我有一个稍微复杂一点的解决方案,无需文件扩展就可以处理这个问题而不需要手动后处理:

  1. 进入您的文件和代码模板 - 其他答案已经详细说明了如何执行此操作。
  2. 文件和代码模板设置页面中,切换到包含标签。
  3. 点击+以创建新的包含模板。 名称类似于IncludeGuard,并将扩展程序设置为h
  4. 输入以下内容。 确保您之前或之后不包含任何空白行。
  5. #macro( includeGuard $filename $ext )
    #set( $ucfull = ${filename.toUpperCase().replace('-', '_')} )
    #set( $extidx = ${ucfull.lastIndexOf(".")} )
    #set( $extstart = $extidx + 1 )
    #if( $extidx > -1 )
    #set( $ucname = ${ucfull.substring(0,$extidx)} )
    #set( $ucext = ${ucfull.substring($extstart)} )
    #else
    #set( $ucname = $!{ucfull} )
    #set( $ucext = ${ext.toUpperCase()} )
    #end
    ${ucname}_${ucext}##
    #end##
    
    1. 更改回文件标签,找到C Header FileC++ Class Header文件,具体取决于您要更新的语言。
    2. 将此文件模板的内容更改为:
    3. #parse("IncludeGuard.h")##
      #set( $blank = "" )
      #[[#ifndef]]# #includeGuard(${NAME} "h")${blank}
      #[[#define]]# #includeGuard(${NAME} "h")${blank}
      
      // ...
      
      #[[#endif]]# // #includeGuard(${NAME} "h")
      

      如果一切正常,尝试使用名称test-include-guardtest-include-guard.h创建 C标题文件,都会产生以下结果:

      #ifndef TEST_INCLUDE_GUARD_H
      #define TEST_INCLUDE_GUARD_H
      
      // ...
      
      #endif /* TEST_INCLUDE_GUARD_H */
      

      很少注意到:

      • 如果您需要更改文件扩展名,请更改includeGuard(${NAME} "h")部分以使用您想要的第二个参数扩展名。该模板将尝试从${NAME}解析文件扩展名,但如果您明确将其输入新文件名对话框,则${NAME}仅包含文件扩展名。
      • CLion使用的Velocity模板中的空白处理的当前状态是一个糟糕的节目,所以如果你决定进一步自定义模板,你需要解决这个问题。一般准则:
        • 如果您遇到不受欢迎的换行符,则需要尝试在其前面的行末尾添加终止行注释##
        • 如果您发现自己处于对立场景中(错过预期的换行符),您可以使用我上面使用的#set( $blank = "" )策略解决此问题。
      • 大多数基于IntelliJ的IDE似乎在第一次传递到#parse()时缓存包含模板的编译。如果您在此之后对包含模板进行了更改,则通常需要使用文件&gt; 在更改传播之前使高速缓存/重新启动菜单命令无效。

答案 2 :(得分:1)

文件|设置|编辑|适用于Windows和Linux的文件和代码模板

CLION |偏好|编辑| OS X的文件和代码模板

#[[#ifndef]]# BASE_${HEADER_FILENAME}
#[[#define]]# BASE_${HEADER_FILENAME}


#[[#endif]]# //BASE_${HEADER_FILENAME}

&GT;

#ifndef BASE_test_h
#define BASE_test_h

#endif //BASE_test_h

选择 BASE_test_h 并按 CTRL + SHIFT + U 改为大写

答案 3 :(得分:0)

根据最新的doc(2019.3,但它也可能在较早的版本中工作),您可以导航至设置/首选项|下的命名约定标签。编辑器代码样式| C / C ++

您将在其中找到一个字段,该字段可让您轻松更改页眉保护模式。无需再添加自定义模板。

enter image description here