【问题标题】:include period in header file name在头文件名中包含句点
【发布时间】:2014-02-05 18:26:35
【问题描述】:

抱歉,这可能是一个愚蠢的问题。我在 C++ 方面相对缺乏经验,我正在编写一个带有头文件的小程序。我的 cpp 和 h 文件名中有句点,例如:“file_ver_1.1.cpp”和“file_ver_1.1.h

在我的头文件中,我有以下代码

#ifndef FILE_VER_1.1_H_
#define FILE_VER_1.1_H_
... some code
#endif 

我收到来自编译器的警告,第一行显示“#ifndef 指令末尾的额外标记”,而“宏名称后缺少空格”定义线。 我的头文件名是否因为下划线和/或句点而无效?我已经阅读了这两篇文章,但我并没有真正理解它们,我仍然感到困惑:

    http://gcc.gnu.org/onlinedocs/cpp/Macros.html#Macros
    http://stackoverflow.com/questions/1653958/why-are-ifndef-and-define-used-in-c-header-files

感谢您的帮助!

【问题讨论】:

  • 您的文件名中实际上没有版本信息,是吗?
  • 鉴于这是一个相当基本的问题,您可能需要查看 SO 的 list of good C++ books
  • 你的头文件名是不是无效的,但是这真的和头文件的名字没有任何关系,只是你写的包含保护而已。
  • 宏名必须是标识符。标识符不是任意字符串;它们可能包含下划线,但可能不包含句点。具体来说,标识符由一个字母或下划线后跟零个或多个字母、下划线或数字组成。以下划线开头的标识符保留给实现使用(尽管它比这稍微复杂一些)。
  • @navr91 包含保护必须对文件是唯一的。如果您使用文件名的 MD5 哈希(以字符为前缀,以防它以数字开头),它也可以正常工作。只要您使用每个头文件唯一的有效标识符,您就可以使您的包含保护您想要的任何东西。

标签: c++


【解决方案1】:

事实上,你的头文件确实是无效的(即使它不是,它也不会像你想象的那样做)。句点不是有效的标识符字符,因此宏名称只是FILE_VER_1

当使用包含保护宏时,您必须设计一个“翻译”不是合法标识符字符的文件名字符的方案。例如,您可以使用_P_ 来表示一个句点。所以你的包含后卫将是:

#ifndef FILE_VER_1_P_1_H_
#define FILE_VER_1_P_1_H_

//...

#endif

您如何做到这一点取决于您(任何其他约定都可以),只要它产生合法标识符即可。而且你应该保持一致。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-22
    • 2011-08-30
    • 1970-01-01
    • 2020-09-27
    • 1970-01-01
    相关资源
    最近更新 更多