如何在CLion中更改C++的include guards?

14

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

#ifndef PROJECTNAME_FILENAME_H
#define PROJECTNAME_FILENAME_H

/* ... code ... */

#endif //PROJECTNAME_FILENAME_H

我只想要FILENAME_H,而不要PROJECTNAME_前缀。如何在CLion设置中更改?


2
你应该避免仅使用 FILENAME_H,在一个项目中有多个文件具有相同的名称并不罕见。 - Holt
3
由于另一个具有相同文件名的头文件也会使用包含保护(include guards),因此这种方法在这种情况下无法起到帮助作用。 - NewProggie
2
一个替代方案是使用 #pragma once 而不是 #ifndef 包含保护。可以在 设置->编辑器->文件和代码模板 下更改用于头文件创建的模板。 - sitic
有些资料称使用#define可以加快编译速度。而#pragma once不是标准的预C++11版本的一部分。 我不相信${PROJECT}_${FILE}_H在CLion中是硬编码的。 - Kroll
模式-我大约15年前“发现”的是<FILENAME>_<EXT>_INCLUDED_<YYYYMMDD>。当我在同一天写2d/Vector.hh3d/Vector.hh时,我会自然而然地添加一些额外的东西,比如墙上时间(VECTOR_HH_INCLUDED_20181003_1953)或文件夹(MATH_2D_VECTOR_HH_INCLUDED_20181003)。当然这还不完美(有些库也可能带有VECTOR_HH_INCLUDED_20181003),但实际上,向量示例是唯一发生在我身上的事件。INCLUDED部分只是为了美观。 - Sebastian Mach
显示剩余2条评论
4个回答

9

虽然回答有点晚,但我有一个更为复杂的解决方案,可以处理任何文件扩展名,而无需手动后处理:

  1. 进入您的文件和代码模板 - 其他答案已经详细说明了如何操作。
  2. 文件和代码模板设置页面中,切换到包含选项卡。
  3. 单击+创建一个新的包含模板。将名称命名为IncludeGuard,并将扩展名设置为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##
  1. 返回到文件标签,在此找到C头文件C++类头文件,具体视需要更新的语言而定。
  2. 将此文件模板内容更改为:
#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()中的Include模板编译后进行缓存。如果您在此之后更改了Include模板,则通常需要使用File > Invalidate Caches/Restart菜单命令才能使更改生效。

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

例如,如果您的文件名是:clion.h,那么_${NAME}_H_会被渲染为_clion_H_,因为${NAME}被渲染为文件名(不包括扩展名)。


1
根据最新的文档(2019.3,但早期版本也可能适用),您可以在设置/首选项|编辑器|代码样式|C/C++下导航到命名约定选项卡。
在那里,您会找到一个字段,允许您轻松更改头文件保护模式。 不再需要添加自定义模板。

enter image description here


1
在Windows和Linux下,可以通过“文件|设置|编辑器|文件和代码模板”来进行相关内容的设置。
在OS X下,可以通过“CLion | 首选项 | 编辑器 | 文件和代码模板”来进行相关内容的设置。
#[[#ifndef]]# BASE_${HEADER_FILENAME}
#[[#define]]# BASE_${HEADER_FILENAME}


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

>

#ifndef BASE_test_h
#define BASE_test_h

#endif //BASE_test_h

选择 BASE_test_h 并按下 CTRL + SHIFT + U 转为大写。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接