C++ 宏标识符中的双冒号

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

我有一个用于我使用的 C++ 项目的日志记录库。它在名称空间记录器中工作::并且在其中我拥有所有必要的类定义和预定义的记录器;

namespace logger {

    class log_level {
        ...
    }

    log_level info;
    log_level debug;
}

现在,为什么是 logger 而不是 log,因为 C++ 已经有了 log 函数,这会导致警告消息:

warning: built-in function 'log' declared as non-function [-Wbuiltin-declaration-mismatch]

现在这可能是可以忽略的东西,if我根本不使用日志功能。但即便如此......我也不喜欢警告和错误。所以我开始考虑一个可以完成这项工作的宏..

但自从尝试以来,我惨遭失败,因为在宏标识符中使用双冒号(:)似乎有点困难。也可能不可能,但我们还是问问那些可能有更多知识的人吧。

#define log::info logger::info

#define PREFIX_LOGGER_NS logger::
#define PREFIX_LOG_NS log::
#define log\:\:info PREFIX_LOGGER_NS info
#define log::debug logger::debug;

全部失败.. 那么,有没有办法解决这个问题,或者要求一个描述性的 3 个单词的假命名空间是否太过分了? :)

c++ macros namespaces c-preprocessor
1个回答
0
投票

这是不可能的,因为宏替换发生在翻译阶段 3,该阶段适用于预处理标记。冒号本身就是一个预处理标记。引用自 cppreference:

  1. 源文件被分解为注释、序列 空白字符(空格、水平制表符、换行符、垂直制表符、 和换页),以及预处理标记,如下:

a) 标头名称,例如 或“myfile.h”

b) 通过预处理导入和模块生成的占位符标记 指令(即 import XXX; 和 module XXX;)(C++20 起)

c) 标识符

d) 预处理数字

e) 字符文字,包括用户定义的字符 文字(C++11 起)

f) 字符串文字,包括用户定义的字符串文字(因为 C++11)

g) 运算符和标点符号(包括替代标记),例如 +, <<=, <%, ##, or and

h) 不适合任何其他字符的单个非空白字符 类别

冒号属于 g 类,不能与其他字符组合形成预处理器标记。

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