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

Hua*_*che 5 c macros opencl

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

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

以下是一个例子:

int y, x = 0;
y = HASH(x);
Run Code Online (Sandbox Code Playgroud)

如果可以在编译行上将HASH定义为宏,那将是很好的,所以当我编译程序时,我可以根据需要重新定义HASH.例如,如果我能这样做会很棒gcc -DHASH(X)=(hash_fcn1(X)) program.c -o program,但我以前从未见过这种事.

我用clBuildProgram尝试过但没有运气.

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

另一个解决方案是在命令行上定义一个平面宏,然后在实际源文件中有一系列保护,控制如何在源文件中定义宏,例如在这个其他帖子中如何比较C中的字符串条件预处理程序指令.

Rit*_*esh 8

#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;
} 
Run Code Online (Sandbox Code Playgroud)

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

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


cup*_*cup 5

宏应定义为不带参数。

gcc -DHASH=hash_fcn1 program.c -o program
Run Code Online (Sandbox Code Playgroud)

如果您希望传递参数,则需要将方括号转义

gcc -DHASH\(X\)=hash_fcn1\(X,55u,33u\) program.c -o program
Run Code Online (Sandbox Code Playgroud)

  • @RunFun查看修改后的答案 (2认同)