【问题标题】:C/C++ Passing Macros that take arguments on the compile lineC/C++ 传递在编译行接受参数的宏
【发布时间】:2016-02-23 14:22:11
【问题描述】:

我想知道是否可以将带有编译行参数的宏传递给 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

【问题讨论】:

  • 我可能忽略了一些事情,但是是什么阻止了你做-DHASH=hashfcn1
  • 你是对的。我对支持带有不同数量参数的哈希函数有点兴趣,但除了一个之外,其他都是硬编码的常量,但是通过添加另一个函数很容易支持。

标签: c macros opencl


【解决方案1】:

宏的定义应该不带参数。

gcc -DHASH=hash_fcn1 program.c -o program

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

gcc -DHASH\(X\)=hash_fcn1\(X,55u,33u\) program.c -o program

【讨论】:

  • 如果我有一些哈希函数可以接受不同数量的参数但其他参数是固定的怎么办? #define HASH(X) (hash_fcn1(X, 55u, 33u))
  • @RunFun 查看修改后的答案
  • 修改后的答案正是我想要的。谢谢!
【解决方案2】:
#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 test.c

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

【讨论】:

    【解决方案3】:

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

    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).

    【讨论】:

      猜你喜欢
      • 2014-05-13
      • 2014-06-26
      • 2010-09-21
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 2016-11-11
      • 2022-08-19
      • 1970-01-01
      相关资源
      最近更新 更多