繁体   English   中英

我可以在 header 文件中定义宏吗?

[英]Can I define a macro in a header file?

我在MyClass.h中有一个宏定义,声明如下:

#define _BufferSize_ 64

我在main.cpp中放置了MyClass.h的 include 指令:

#include "MyClass.h"

这是否意味着我可以在main.cppMyClass.h中使用_BufferSize_ 另外,这是好习惯吗?

是的,这就是 header 文件的目的:在一个文件中创建声明和常量,您可以随时将其“包含”到翻译单元中。

但是,您的宏名称是 illegal ,现在一个不错的constexpr size_t BufferSize = 64会更加惯用; 即使在 C++ 的最新版本之前,在许多情况下,类型化常量也优于宏。

是的,它会起作用。 (忽略其他人指出的下划线问题。)

指令#include "MyClass.h"只是复制文件MyClass.h的全部内容并将其粘贴到#include的位置。 从编译器的角度来看,只有一个源文件由用户指定的文件和所有包含的文件组成。


话虽如此,如果您使用语言内构造而不是预处理器指令会好得多。 例如替换:

#define _BufferSize_ 64

constexpr size_t BufferSize = 64;

它与#define唯一不同的是它指定了值的类型(在本例中为size_t )。 除此之外,第二个代码将以相同的方式运行,并且避免了预处理器的缺点。

通常,尽量避免使用预处理器指令。 这是一种旧机制,在 c++ 还不能用语言做这些事情时使用过。

首先,关于标识符_BufferSize_ ,标准规定:

3 . ...一些标识符保留供 C++ 实现使用,不得以其他方式使用; 无需诊断。

(3.1) 每个包含双下划线 __ 或以下划线后跟大写字母开头的标识符都保留给实现以供任何使用

因此,在您的代码中使用这样的标识符会导致未定义的行为。

正如评论中已经建议的那样,在 C++ 中使用宏变量不是好的做法。您可以改用const int

3 年后回复,因为答案是错误的,这是某些关键字的第一个谷歌搜索结果。

https://google.github.io/styleguide/cppguide.html#Preprocessor_Macros

避免定义宏,尤其是在标题中 更喜欢内联函数、枚举和 const 变量。 使用特定于项目的前缀命名宏。 不要使用宏来定义 C++ API 的片段。

本人高亮,非原文。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM