我对这个内联模块测试做错了什么?

时间:2010-03-04 03:38:25

标签: perl

更新:我选择放错的地方的错误。我没有注意到@Sinan提到的那些添加可能他们被我的浏览器阻止了。无论如何我现在已经删除了链接。谢谢你们:)

在我的[上一篇文章] [1]中,@ daotoad提到了一个内联模块。现在我正在玩它。好吧,实际上除了Perl之外,我基本上对其他编程语言一无所知。脚本是为了纯粹的乐趣而编写的。我想看看我是否可以向我的Perl脚本抛出一些用其他编程语言编写的代码并以某种方式让它工作。

好吧,我将我在网上找到的CPP源代码复制到我的Perl脚本中,并且我一直在努力使其工作,但我得到的只是一个错误消息: 对于导入的CPP图书馆来说,这看起来很可疑,但我不确定。以下信息是引起我注意的错误信息的一部分:

E:/solarlunar.h:53: error: expected identifier before "false"
E:/solarlunar.h:53: error: expected `}' before "false"
E:/solarlunar.h:53: error: expected unqualified-id before "false"
E:/solarlunar.h:53: error: expected declaration before '}' token
In file included from _3_pl_62cb.xs:19:
E:/solarlunar.h:1:1: unterminated #ifndef
NMAKE : fatal error U1077: 'C:\WINDOWS\system32\cmd.exe' : return code '0x1'
Stop.

A problem was encountered while attempting to compile and install your Inline
CPP code. The command that failed was:
  nmake > out.make 2>&1

我已经检查了solarlunar.h文件的第53行,稍后谷歌了解它可能意味着什么我认为这行看起来很无辜但是作为一个完整的C ++新手我不确定:

**typedef enum boolean { false = 0, true = 1 } boolean;** 

我尝试使用DEV-C ++编译和测试C ++代码,一切都按预期工作。

我的脚本(已更新)是:

    #Inline-Test.pl
 use warnings;
 use Inline 'CPP' => Config => LIBS => 'E:/';
    use Inline 'CPP' => Config => INC  => 'E:/';
 use Inline 'CPP';

    my $args = <STDIN>;     
 chomp $args;
    my $result = main($args); 
    print $result;

__END__
__CPP__


#include <stdio.h>
#include <stdlib.h>
#include "solarlunar.h"
#include "solarlunar.c"

/**//* input format: sl -[s|l]   year.month.day */
/**//* the lunar calendar date range is limited by solarlunar.h: 1899/12/1 ~ 2099.12.30 */

static void usage(void);

int main(int argc, char *argv[])
{
    int year, month, day;
    int i;
    /**//* convert flag, 0: solar convert to luanr. 1: lunar convert solar */
    int convert_f = 0;
    solar_calendar so;
    lunar_calendar lu;

    /**//* input check */
    if( argc < 3 || argv[1][0]!= '-' ||
         !(argv[1][2] == 's' || argv[1][3] == 'l')) {
        usage();
        exit(1);
    }

    /**//* get convert flag */
    convert_f = (argv[1][4] == 's' ? 0 : 1);

    /**//* converting */
    for(i = 2; i < argc; i++) {
        sscanf(argv[i], "%d.%d.%d", &year, &month, &day);
        switch(convert_f) ...{
            case 0:
                so = solar_creat_date(year, month, day);
                lu = solar2lunar(so);
                printf("%d.%d.%d ", lunar_get_year(lu), lunar_get_month(lu), lunar_get_day(lu));
                break;
            case 1:
                lu = lunar_creat_date(year, month, day);
                so = lunar2solar(lu);
                printf("%d.%d.%d ", solar_get_year(so), solar_get_month(so), solar_get_day(so));
                break;
            default :
                exit(2);
        }
    }
        return 0;
}


static void usage(void)
{
    printf("sl -[s|l] year1.month1.day1 year2.month2.day2 ... "
            "-s: solar calendar date convert to lunar calendar date. "
            "-l: lunar calendar date convert to lunar calendar date.");
}

可以从[here]和[here]下载必要的库。 对不起,错误的地方放东西。链接现已删除。

1 个答案:

答案 0 :(得分:3)

您的问题源于您尝试将C源代码编译为C ++。这个愚蠢程序的作者似乎想在C中使用布尔类型,因此使用枚举来定义它:

typedef enum boolean { false = 0, true = 1} boolean; 

现在,这会使C ++编译器运行起来,因为该语言具有bool类型,truefalse是该类型的值。赋值false = 0无效C ++。

有趣的是,boolean这个词只出现在solarlunar.c的一个地方:

boolean is_leap_year(const int year)
{
    return LEAP(ABS(year));
}

将该函数的返回类型更改为int并删除typedef中的solarlunar.h应解决此问题。使用C将源代码编译为gcc,即使没有这些更改,也不会出现错误。