Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么是#定义FOO(模板)";做 我发现了一些奇怪的C++预处理器子句,如: #define COMPILER_FLOAT_ENTRIES_DO(template)_C++_C_Macros_C Preprocessor - Fatal编程技术网

什么是#定义FOO(模板)";做 我发现了一些奇怪的C++预处理器子句,如: #define COMPILER_FLOAT_ENTRIES_DO(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和调用模板(某物)意味着什么?我在谷歌找不到任何东西;可能是因为“#define”和“template”是非常常见的词

整个代码位于。

此处的“模板”一词是一个巧合。预处理器以这种方式对保留字不敏感,因为它主要只执行文本操作

这是一个标准宏,它将函数名作为参数,并使用这些参数调用该函数三次。它的第一个版本后面没有任何内容,看起来像是调试版本或其他版本,旨在使其在某些上下文中成为无操作

#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
}