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

Kro*_*oll 12 c++ include-guards clion

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

#ifndef PROJECTNAME_FILENAME_H
#define PROJECTNAME_FILENAME_H

/* ... code ... */

#endif //PROJECTNAME_FILENAME_H
Run Code Online (Sandbox Code Playgroud)

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

小智 7

  1. 设置 - >编辑 - >文件和代码模板 - >文件
  2. 改变${INCLUDE_GUARD}_${NAME}_H_

例如,如果您的文件名是:clion.h,则_${NAME}_H_呈现为_clion_H_,因为${NAME}呈现为文件名(没有扩展名).


Cha*_*ald 6

这个问题有点晚了,但是我有一个稍微复杂的解决方案,可以解决此问题,而无需手动进行后处理,而无需考虑文件扩展名:

  1. 进入文件和代码模板 -其他答案已经详细说明了如何执行此操作。
  2. 在“ 文件和代码模板设置”页面中,更改为“ 包含”选项卡。
  3. 单击+以创建一个新的包含模板。将其命名IncludeGuard,并将Extension设置为h
  4. 输入以下内容。确保前后没有空白行。
#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##
Run Code Online (Sandbox Code Playgroud)
  1. 改回“ 文件”选项卡,然后根据要更新的语言查找C Header FileC++ Class Header文件。
  2. 将此文件模板的内容更改为:
#parse("IncludeGuard.h")##
#set( $blank = "" )
#[[#ifndef]]# #includeGuard(${NAME} "h")${blank}
#[[#define]]# #includeGuard(${NAME} "h")${blank}

// ...

#[[#endif]]# // #includeGuard(${NAME} "h")
Run Code Online (Sandbox Code Playgroud)

如果一切正常,请尝试使用该名称创建C头文件test-include-guard否则test-include-guard.h将导致以下结果:

#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##
Run Code Online (Sandbox Code Playgroud)

一些注意事项:

  • 如果需要更改文件扩展名,请更改includeGuard(${NAME} "h")部件以将所需的任何扩展名用作第二个参数。该模板将尝试从中解析文件扩展名${NAME},但${NAME}仅在您将文件扩展名明确输入新文件名对话框时才包含该文件扩展名。
  • CLion使用的Velocity模板中空白处理的当前状态很糟糕,因此,如果您决定进一步自定义模板,则需要像我一样解决此问题。一般准则:
    • 如果遇到不需要的换行符,则需要尝试##在其前面的行尾添加终止行注释。
    • 如果您陷入困境,(错过了预期的换行符),则可以使用#set( $blank = "" )我上面使用的策略来解决此问题。
  • 大多数基于IntelliJ的IDE似乎在第一次将Include模板传递给时都将其缓存#parse()。如果您在此之后对“包含”模板进行了更改,通常需要在更改传播之前使用“ 文件” >“ 无效的缓存/重新启动”菜单命令。