![](/img/trans.png)
[英]How can I access the define macro in the header file from other files with Conditional Compilation?
[英]Can I define a macro in a header file?
我在MyClass.h
中有一个宏定义,声明如下:
#define _BufferSize_ 64
我在main.cpp
中放置了MyClass.h
的 include 指令:
#include "MyClass.h"
这是否意味着我可以在main.cpp
和MyClass.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.