我可以在头文件中定义一个宏吗?

问题描述 投票:1回答:3

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

#define _BufferSize_ 64

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

#include "MyClass.h"

这是否意味着我可以在main.cpp和MyClass.h中使用BufferSize?这也是一个好习惯吗?

c++ header
3个回答
3
投票

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

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


话虽如此,如果你使用in-language构造而不是preprocessor指令会好得多。例如替换:

#define _BufferSize_ 64

constexpr size_t BufferSize = 64;

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

通常,尽量避免使用预处理程序指令。这是一种旧的机制,当c ++还没有在语言中做这件事时使用。


3
投票

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

然而,your macro name is illegal和一个不错的constexpr size_t BufferSize = 64现在更加惯用;甚至在最近的C ++版本之前,在许多情况下,类型化常量优于宏。


2
投票

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

3。 ...某些标识符保留供C ++实现使用,否则不得使用;无需诊断。

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

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

正如评论中已经建议的那样,使用宏变量并不是C ++中的好习惯。您可以使用const int代替。

© www.soinside.com 2019 - 2024. All rights reserved.