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

问题描述 投票:3回答:3

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

c macros opencl
3个回答
7
投票
#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 test.c和gcc -O0 -DHASH = func2 -o test test.c

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


4
投票

应该在没有参数的情况下定义宏。

gcc -DHASH=hash_fcn1 program.c -o program

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

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

2
投票

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

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)

© www.soinside.com 2019 - 2024. All rights reserved.