2014-10-10 568 views
0

我的一个应用程序有一个CONNECTION_TIMEOUT常量(其名称非常明了)。此常数被定义为一个预处理宏(#define)如下:通过AC_DEFINE给一个宏赋予一个整数值

#ifndef CONNECTION_TIMEOUT 
#define CONNECTION_TIMEOUT 3 
#endif 

我之所以用#ifndef#endif这里是因为我想这个宏是可配置在编译的时候,也就是通过./configure脚本。

AC_ARG_WITH([timeout], [AS_HELP_STRING([--with-timeout], [...])]) 
AS_IF([test "x$with-timeout" != "x"], 
    [AC_DEFINE_UNQUOTED([CONNECTION_TIMEOUT], ["$with-timeout"], ["..."])] 
) 

由于这一点,用户可以编译一个自定义的超时值的应用程序:为了实现这一点,我在configure.ac文件添加一个开关

./configure --with-timeout=1 

事情是,当我做这个,我的宏设置为"1",而不是1。正因为如此,当我试图操纵它......

int timeout = CONNECTION_TIMEOUT; 

...指向(char*)整数(int),没有一个演员。很值得期待。

我怎样才能得到autoconf将我的宏设置为一个整数值,没有引号?我一直在使用单引号试过了,AC_DEFINE但我不能得到正确的价值...

+0

您是否尝试过只用'[$有超时]的''而不是[ “$与超时”]'? – ccKep 2014-10-10 12:53:14

+0

是的。我的宏设置为''-timeout''('$ with'为空,'-timeout'为字符串)。 – 2014-10-10 12:57:18

+1

一般来说,'AC_ARG_WITH'用于外部包,你可能想在第一时间看看'AC_ARG_VAR'。例如,使用'AC_ARG_WITH'允许使用'--without-timeout'。然后,只需使用不带破折号的变量名称,就可以删除上面的引号。 – ccKep 2014-10-10 13:05:50

回答

3

您正在尝试取消引用错误的shell变量。 Autoconf将--with-timeout参数的值显示为$with_timeout(注意:下划线而不是连字符)。表达$with-timeout是可能的,未初始化的变量$with和文字串-timeout的concatentation。

换句话说,使用

AC_DEFINE([CONNECTION_TIMEOUT], [$with_timeout]) 
+0

而且...编译成功了,谢谢!不过,我使用了'AF_DEFINE_UNQUOTED',否则,我得到解除引用。 – 2014-10-10 16:21:41

相关问题