什么是#定义FOO(模板)";做 我发现了一些奇怪的C++预处理器子句,如: #define COMPILER_FLOAT_ENTRIES_DO(template)
及 将“模板”保留字传递给#define和调用模板(某物)意味着什么?我在谷歌找不到任何东西;可能是因为“#define”和“template”是非常常见的词 整个代码位于。此处的“模板”一词是一个巧合。预处理器以这种方式对保留字不敏感,因为它主要只执行文本操作 这是一个标准宏,它将函数名作为参数,并使用这些参数调用该函数三次。它的第一个版本后面没有任何内容,看起来像是调试版本或其他版本,旨在使其在某些上下文中成为无操作什么是#定义FOO(模板)";做 我发现了一些奇怪的C++预处理器子句,如: #define COMPILER_FLOAT_ENTRIES_DO(template),c++,c,macros,c-preprocessor,C++,C,Macros,C Preprocessor,及 将“模板”保留字传递给#define和调用模板(某物)意味着什么?我在谷歌找不到任何东西;可能是因为“#define”和“template”是非常常见的词 整个代码位于。此处的“模板”一词是一个巧合。预处理器以这种方式对保留字不敏感,因为它主要只执行文本操作 这是一个标准宏,它将函数名作为参数,并使用这些参数调用该函数三次。它的第一个版本后面没有任何内容,看起来像是调试版本或其他版本,旨在使其在某些上下文中成为无操作 #define COMPILER_FLOAT_ENTRIES_DO(tem
#define COMPILER_FLOAT_ENTRIES_DO(template)
因此编译器\u FLOAT\u条目\u DO(x)
被替换为“”。换句话说,它将从代码中删除该宏
#define COMPILER_FLOAT_ENTRIES_DO(template) \
template(jvm_fadd) \
template(jvm_fsub) \
template(jvm_f2d)
因此COMPILER\u FLOAT\u ENTRIES\u DO(x)
被x(jvm\u fadd)x(jvm\u fsub)x(jvm\u f2d)
取代
如果所有其他操作都失败,您可以通过使用
g++-E-o foo.cpp
将宏预处理的输出保留在foo.cpp
中来查看宏的情况。当然,您还需要命令行传递的所有其他编译标志(尤其是-D和-I标志)。您经常在数据驱动编程设计模式中找到这种类型的编码
当您希望多次包含相同的文件(数据),但宏被不同的代码或其他数据替换时,这非常方便
让我们假设一些属性和相应的类型:
/// @file data.h
my_attribute(color, int)
my_attribute(volume, float)
编码部分可以使用数据,甚至不需要知道数量。
例如,让我们打印一些信息
/// @file main.c
void help()
{
#define my_attibute(name,type) cout << #name << ": " << #type << endl;
cout << "available attributes:" << endl;
#include "data.h"
#undef my_attribute
}
//@file main.c
无效帮助()
{
#定义我的态度(名称、类型)尽管在特定的文件中出现了C++,但宏集本身是在C环境中产生的,代码< >模板>代码>不是预留的字。即使在C++中,它也不是真正预留到预处理器阶段,但通常使用保留字作为宏名或形式,通常被认为是不好的做法。l参数,因为这里可能会出现混淆。根据我的经验,我会说“经常”而不是“通常”。它本质上是您演示的技术中不可或缺的一部分。但它并不是带参数的宏的唯一用途,而OP的情况更可能是特定硬件体系结构的某种优化,其中操作在一个体系结构中不需要,最好通过三个类似的源文本来实现函数调用(但可能是三个asm
-ish语句)在某些其他体系结构中。
/// @file main.c
void help()
{
#define my_attibute(name,type) cout << #name << ": " << #type << endl;
cout << "available attributes:" << endl;
#include "data.h"
#undef my_attribute
}