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

标签 c macros opencl

我想知道是否可以将在编译行上接受参数的宏传递给 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 或我选择的语言的字符串替换或正则表达式库。

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

最佳答案

#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 测试测试.c

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

关于C/C++ 传递在编译行上接受参数的宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33837828/

相关文章:

cuda - OpenCL 动态并行性/GPU 产生的线程?

c++ - C/C++ 中 OpenGL 着色器的简单框架

c - 如何打印当前时间和日期

c - 为什么下面的代码不能编译?

parallel-processing - 使用 OpenMP 减少 : linear merging or log(number of threads) merging

opencl - 为 FPGS 安装驱动程序和内核模块失败

银行家算法中 '->' 的 C 结构无效类型参数

c - 如何修复 'implicit declaration of function ' 管道 2' is invalid in C99'

c - 在 C 中将 var 赋值给 var

macros - 如何使用先前的定义重新定义宏