“#define FOO(模板)”有什么作用?

时间:2010-08-20 20:00:09

标签: c++ c macros c-preprocessor

我发现了一些奇怪的C ++预处理器子句,如:

#define COMPILER_FLOAT_ENTRIES_DO(template)

#define COMPILER_FLOAT_ENTRIES_DO(template) \
  template(jvm_fadd)  \
  template(jvm_fsub)  \
  template(jvm_f2d)  

将“模板”保留字传递给#define,调用模板(某物)意味着什么?我在谷歌找不到任何东西;可能是因为“#define”和“模板”真的很常见。

整个代码位于https://phoneme.dev.java.net/source/browse/phoneme/components/cldc/trunk/src/vm/share/ROM/ROMWriter.hpp?rev=19839&view=markup

3 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:6)

#define COMPILER_FLOAT_ENTRIES_DO(template)

所以COMPILER_FLOAT_ENTRIES_DO(x)被替换为''。换句话说,它从代码中删除了该宏。

#define COMPILER_FLOAT_ENTRIES_DO(template) \
  template(jvm_fadd)  \
  template(jvm_fsub)  \
  template(jvm_f2d) 

所以COMPILER_FLOAT_ENTRIES_DO(x)x(jvm_fadd) x(jvm_fsub) x(jvm_f2d)替换。

如果所有其他方法都失败了,您可以使用g++ -E -o foo.cppfoo.cpp中保留宏预处理的输出,以查看宏发生了什么。当然,您还需要命令行传递的所有其他编译标志(尤其是-D和-I标志)。

答案 2 :(得分:3)

您经常在数据驱动编程设计模式中找到这种类型的编码。

如果您想要多次包含相同的文件( Data ),但是用不同的代码或其他数据替换宏,这很方便。

让我们假设一些属性和相应的类型:

/// @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
}

(请注意#name用于获取文字字符串“color”而不是值color

这样,代码独立于数据

编辑:根据@RBerteig

修复拼写错误和英文句子