C/C++ 传递在编译行上接受参数的宏

C/C++ Passing Macros that take arguments on the compile line

我想知道是否可以将在编译行上接受参数的宏传递给 gcc 或其他 C/C++ 编译器。

我以前从未见过这个,但它实际上对我一直在做的一些 OpenCL 开发很有用,我想用一个可以在编译时替换的宏替换函数名。

下面是一个例子:

int y, x = 0;
y = HASH(x);

如果能在编译行把HASH定义为一个宏就好了,这样我在编译程序的时候,可以根据需要重新定义HASH。比如,如果我能做到gcc -DHASH(X)=(hash_fcn1(X)) program.c -o program就好了,但我以前从未见过这种事情。

我已经用 clBuildProgram 试过了,但没有成功。

我意识到我可以让另一个程序传递程序并用正确的函数名替换 HASH,但我想知道是否有一种简单的方法可以在不使用 sed、awk 等工具的情况下完成此操作,或者我选择的语言的字符串替换或正则表达式库。

另一个解决方案是在命令行上定义一个平面宏,然后在实际的源文件中有一系列的守卫来控制宏在源文件中的定义方式,例如就像另一个 post how to compare string in C conditional preprocessor-directives.

宏定义时应不带参数。

gcc -DHASH=hash_fcn1 program.c -o program

如果要传递参数,括号需要转义

gcc -DHASH\(X\)=hash_fcn1\(X,55u,33u\) program.c -o program
#include <stdio.h>


int func2(int x) {
  return x+1;
}

int func1(int x) {
  return x+2;
}

int main()
{
  int x = 0;
  int y = HASH(x);
  printf("x=%d\n", y);
  return 0;
} 

我写了上面的代码并编译了: gcc -O0 -DHASH=func1 -o 测试 test.c 和 gcc -O0 -DHASH=func2 -o 测试 test.c

我得到了输出 1 和 2。我认为需要注意的重要一点是我没有在代码中的任何地方#defined HASH。

可能不完全是您想要的,但实现此目的的一个简单方法是生成一个包含文件。

program.c:

#include "hash.h"
int y, x=0;
y = HASH(x);

然后你的编译会做类似

的事情
echo '#define HASH(X) hashfunc1(X)' >hash.h
gcc -o program program.c

一个优点是您可以将 HASH 定义为比调用单参数函数更复杂的东西。例如。 #define HASH(X) hashfunc1(X, other_complicated_arguments).