C++ 定义类似关键字的宏只是为了提高代码可读性

C++ 定义类似关键字的宏只是为了提高代码可读性,c++,macros,code-readability,C++,Macros,Code Readability,如果宏可以提高代码的可读性,那么定义类似关键字的宏是错误的吗 例如,隐式宏: #define IMPLICIT /* IMPLICIT constructor(parameters...); */ struct X { explicit X(); IMPLICIT X(int i); IMPLICIT X(std::sting s); explicit X(const char* ch); }; 而不是: struct X { explicit X()

如果宏可以提高代码的可读性,那么定义类似关键字的宏是错误的吗

例如,
隐式
宏:

#define IMPLICIT /* IMPLICIT constructor(parameters...); */

struct X
{
    explicit X();
    IMPLICIT X(int i);
    IMPLICIT X(std::sting s);
    explicit X(const char* ch);
};
而不是:

struct X
{
    explicit X();
    X(int i);
    X(std::sting s);
    explicit X(const char* ch);
};
考虑事项:无论代码可读性如何,都可以更改
隐式
宏的定义,以简单地禁用所有隐式构造函数或…,以便将来维护


编辑:我的示例不重要,我的问题不是针对它的,我删除了
宏示例。

很难找到好的示例,其中用于提高可读性的宏无法避免

这是我能想到的最好的例子(来自Linux内核):

例如:

struct book {
  char title[100];
  char author[100];
};

// ...
printf("%lu\n", FIELD_SIZEOF(struct book, title)); // prints 100

(我不知道这个宏是否可以在C++中避免)< /P>


除此之外,我认为当宏用于代码生成以消除样板代码时,有时可以提高可读性。

很难找到好的示例,在这些示例中,无法避免使用宏来提高可读性

这是我能想到的最好的例子(来自Linux内核):

例如:

struct book {
  char title[100];
  char author[100];
};

// ...
printf("%lu\n", FIELD_SIZEOF(struct book, title)); // prints 100

(我不知道这个宏是否可以在C++中避免)< /P>


除此之外,我认为当宏用于代码生成以消除样板代码时,有时可以提高可读性。

如前所述,宏不会提高可读性。有人可能想知道
隐式
是什么意思,认为它们执行了一些特殊的功能,而实际上它们没有。它似乎更适合于注释或重构。在像VisualStudio这样的IDE中,您可以折叠代码行(隐藏/显示它们)或将它们分组到文档块中(即,
#REGION
)。不执行任何操作的宏只会给代码添加噪音。

如上所述,宏不会增强可读性。有人可能想知道
隐式
是什么意思,认为它们执行了一些特殊的功能,而实际上它们没有。它似乎更适合于注释或重构。在像VisualStudio这样的IDE中,您可以折叠代码行(隐藏/显示它们)或将它们分组到文档块中(即,
#REGION
)。不做任何事情的宏只会给代码添加噪音。

我最好的宏是日志宏:

#define SYSTEM_FAILURE(code, comment) \
{ \
    System_Failure(code, comment, __FILE__, __FUNCTION__, __LINE__); \
}
宏是插入遇到故障的文件名、函数名和行号的最简单方法


除了这个宏,我们店里没有

我最好的宏是日志宏:

#define SYSTEM_FAILURE(code, comment) \
{ \
    System_Failure(code, comment, __FILE__, __FUNCTION__, __LINE__); \
}
宏是插入遇到故障的文件名、函数名和行号的最简单方法

除了这个宏,我们店里没有

定义类似关键字的宏只是为了提高代码可读性

我认为可以接受。但正如马可所说,这是相当主观的


我认为一个宏增强可读性的例子是C++和 Noope。奇怪的是,指定
throw();与抛出(SomeException)
相反,这意味着函数可以抛出异常。当某个东西不抛出时,声明它
throw()

关于堆栈溢出的很多讨论:


Microsoft在
中定义了
输出
输入
,以帮助提高可读性和可用性。宏修饰函数参数,并且定义为空。例如,您可能会看到(我手头没有特定的Microsoft示例):


相关:宏有助于抽象平台差异。例如,从共享对象(Unix和仿制品)或动态链接库(Windows)导出函数


相关:宏有助于抽象配置差异。例如,
ASSERT
在调试和发布配置中的含义或实现


相关:劫持关键字可能会有所帮助。例如,在测试期间,将C++的
protected
private
重新定义为
public
会很有帮助,因此可以针对通常无法访问的方法编写测试用例

定义类似关键字的宏只是为了提高代码可读性

我认为可以接受。但正如马可所说,这是相当主观的


我认为一个宏增强可读性的例子是C++和 Noope。奇怪的是,指定
throw();与抛出(SomeException)
相反,这意味着函数可以抛出异常。当某个东西不抛出时,声明它
throw()

关于堆栈溢出的很多讨论:


Microsoft在
中定义了
输出
输入
,以帮助提高可读性和可用性。宏修饰函数参数,并且定义为空。例如,您可能会看到(我手头没有特定的Microsoft示例):


相关:宏有助于抽象平台差异。例如,从共享对象(Unix和仿制品)或动态链接库(Windows)导出函数


相关:宏有助于抽象配置差异。例如,
ASSERT
在调试和发布配置中的含义或实现



相关:劫持关键字可能会有所帮助。例如,在测试过程中,将C++的
protected
private
重新定义为
public
可能会很有帮助,这样就可以针对通常无法访问的方法编写测试用例。

但您并没有提高代码的可读性。我投票决定以“主要基于意见”的方式结束此测试,因为这是主观的。。在里面