在#define中使用双冒号(::)
Use double colons (::) in #define
本文关键字:#define 更新时间:2023-10-16
我可以在#define
中使用双冒号吗?我想在实现文件中保存一些文字,例如:
// foo.h
#define template template <class T>
#define foo:: foo<T>::
template class foo {
T& baz();
};
#include "foo.tpp"
#undef template
#undef foo::
// foo.tpp
template T& foo::baz() {
// do stuff.
}
但是我得到语法错误,我不是真的理解。(参见codepad的示例):
第11行:错误:宏名
后缺少空白第10行:错误:在#undef指令
的末尾有额外的标记第4行:错误:'foo'不是模板
编译由于-Wfatal-errors而终止。
No。宏的名称必须是标识符;它不能由其他字符组成,也不能由多个令牌组成。
#define template
无效,因为template
不是标识符,而是关键字。
#define foo:: foo<T>::
在C90和c++ 98中是有效的:它定义了一个名为foo
的宏,它被:: foo<T>::
取代(这不是你想做的,但它是有效的)。然而,这在C99和c++ 11中是无效的,因为在这些语言的新版本中,类对象宏的名称和它的替换列表(用来替换它的标记)之间必须有空格。
相关文章:
- 与C代码相比,为什么C++代码不需要"#define _POSIX_C_SOURCE 200809L"?
- 以下 C++ 代码用于 -> "#define idiv(a, b) (((a) + (b) / 2) / (b))" 是什么?
- 如何以静态代码分析友好的方式使用 #define 防护?
- C++相当于整数的 #define
- #define Dbg(fmt,..) (0) 是什么意思? 警告:表达式无效
- 在C++中使用变量而不是"#define"来指定数组大小是不是一种糟糕的做法?(C错误:在文件范围内
- 我们可以用 C 语言嵌套 #define 和 #if 吗?
- 如何将旧的 C 样式 #define 映射与现代C++进行调整?
- 找不到 #define 的函数定义
- "#define X X"是什么意思?
- 使用 constexpr 替换 #define 和 #ifdef 进行条件编译
- 野牛/flex:计算器将双精度值解释为整数,所以我添加了 YYSTYPE 双精度 #define 但我有多个编译错误
- 如何解决C++中声纳库贝静态代码分析错误"Explicitly define the missing copy constructor, move constructor .."
- c中 #define 的不足
- 使用 [#define & #ifdef] 跨文件激活代码块
- 如何避免#define语法的变量重新声明
- 使用 GCC 对 C 文件进行部分预处理(不删除 "define" 指令)
- 使用 #define 声明函数
- #define 宏中的括号失败
- 初始化在类类型 #define 中定义的非静态成员数组,不带默认 ctor