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

时间:2019-02-26 11:15:16

标签: c++ header

我在if debut >= fin then -- do something else if fin >= debut then -- you start a new "if" here! -- notice the space between else and if -- do the else end if -- end the second if end if -- end the first if 中有一个宏定义,如下所示:

var arr = [
  {"id":1,"name":"admin","password":"admin","role":"Admin"},
  {"id":2,"name":"user","password":"user","role":"User"},
  {"id":3,"name":"superadmin","password":"superadmin","role":"superadmin"}
]

arr.forEach(function(obj) {
  console.log('name: ' + obj.name);
  console.log('password: ' + obj.password);
})

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

MyClass.h

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

3 个答案:

答案 0 :(得分:3)

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

但是,your macro name is illegal和一个不错的constexpr size_t BufferSize = 64在当今会更加惯用;即使在最新版本的C ++之前,在很多情况下,类型常量也比宏更可取。

答案 1 :(得分:3)

是的,它将起作用。 (不考虑别人指出的下划线问题。)

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


话虽如此,如果您使用语言构造而不是预处理程序指令,那就更好了。 例如替换:

#define _BufferSize_ 64

constexpr size_t BufferSize = 64;

它唯一与#define不同的地方是它指定了值的类型(在这种情况下为size_t)。除此之外,第二个代码的行为方式相同,并且避免了预处理器的缺点。

通常,请尝试避免使用预处理程序指令。这是一种古老的机制,当c ++尚无法在语言中进行此操作时使用。

答案 2 :(得分:2)

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

  

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

     

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

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

并且正如注释中已经建议的那样,在C ++中使用宏变量不是一种好习惯。您可以改用const int