免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2325 | 回复: 4
打印 上一主题 下一主题

求救:在rh9下的程序放到fc6下出错 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-01-25 18:52 |只看该作者 |倒序浏览
g++ -fPIC -o iodevice.o -O2 -fpack-struct -fPIC -c iodevice.cpp
printioctl.h: In function ‘char* sprintIoCtl(ULONG, const void*, ULONG)’:
printioctl.h:45: 错误:‘__invalid_size_argument_for_IOC’ 不能出现在常量表达式中
printioctl.h:46: 错误:‘__invalid_size_argument_for_IOC’ 不能出现在常量表达式中
printioctl.h:47: 错误:‘__invalid_size_argument_for_IOC’ 不能出现在常量表达式中
printioctl.h:48: 错误:‘__invalid_size_argument_for_IOC’ 不能出现在常量表达式中
printioctl.h:49: 错误:‘__invalid_size_argument_for_IOC’ 不能出现在常量表达式中
printioctl.h:50: 错误:‘__invalid_size_argument_for_IOC’ 不能出现在常量表达式中
printioctl.h:51: 错误:‘__invalid_size_argument_for_IOC’ 不能出现在常量表达式中
printioctl.h:52: 错误:‘__invalid_size_argument_for_IOC’ 不能出现在常量表达式中
printioctl.h:53: 错误:‘__invalid_size_argument_for_IOC’ 不能出现在常量表达式中
printioctl.h:54: 错误:‘__invalid_size_argument_for_IOC’ 不能出现在常量表达式中
printioctl.h:55: 错误:‘__invalid_size_argument_for_IOC’ 不能出现在常量表达式中
printioctl.h:56: 错误:‘__invalid_size_argument_for_IOC’ 不能出现在常量表达式中
printioctl.h:58: 错误:‘__invalid_size_argument_for_IOC’ 不能出现在常量表达式中
printioctl.h:59: 错误:‘__invalid_size_argument_for_IOC’ 不能出现在常量表达式中
iodevice.cpp: In function ‘const char* IoCtlToStr(UINT32)’:
iodevice.cpp:33: 错误:‘__invalid_size_argument_for_IOC’ 不能出现在常量表达式中
iodevice.cpp:34: 错误:‘__invalid_size_argument_for_IOC’ 不能出现在常量表达式中
iodevice.cpp:35: 错误:‘__invalid_size_argument_for_IOC’ 不能出现在常量表达式中
iodevice.cpp:36: 错误:‘__invalid_size_argument_for_IOC’ 不能出现在常量表达式中
iodevice.cpp:37: 错误:‘__invalid_size_argument_for_IOC’ 不能出现在常量表达式中
iodevice.cpp:38: 错误:‘__invalid_size_argument_for_IOC’ 不能出现在常量表达式中
iodevice.cpp:39: 错误:‘__invalid_size_argument_for_IOC’ 不能出现在常量表达式中
iodevice.cpp:40: 错误:‘__invalid_size_argument_for_IOC’ 不能出现在常量表达式中
iodevice.cpp:41: 错误:‘__invalid_size_argument_for_IOC’ 不能出现在常量表达式中
iodevice.cpp:42: 错误:‘__invalid_size_argument_for_IOC’ 不能出现在常量表达式中
iodevice.cpp:43: 错误:‘__invalid_size_argument_for_IOC’ 不能出现在常量表达式中
iodevice.cpp:44: 错误:‘__invalid_size_argument_for_IOC’ 不能出现在常量表达式中
iodevice.cpp:46: 错误:‘__invalid_size_argument_for_IOC’ 不能出现在常量表达式中
iodevice.cpp:47: 错误:‘__invalid_size_argument_for_IOC’ 不能出现在常量表达式中
make: *** [iodevice.o] 错误 1

请问这是什么错误?

论坛徽章:
0
2 [报告]
发表于 2007-01-25 21:33 |只看该作者

回复 1楼 wanghun 的帖子

我把相关代码提取出来,放到vc下编译,错误提示“case expression not constant”,
即case语句表达式不是常量,跟linux下的错误提示类似,恳请指教。

论坛徽章:
0
3 [报告]
发表于 2007-01-25 21:34 |只看该作者

回复 2楼 wanghun 的帖子

提取代码如下:

#include <stdio.h>

#define _IOC_NRBITS     8
#define _IOC_TYPEBITS   8
#define _IOC_SIZEBITS   14

#define _IOC_NRSHIFT    0
#define _IOC_TYPESHIFT  (_IOC_NRSHIFT+_IOC_NRBITS)
#define _IOC_SIZESHIFT  (_IOC_TYPESHIFT+_IOC_TYPEBITS)
#define _IOC_DIRSHIFT   (_IOC_SIZESHIFT+_IOC_SIZEBITS)

#define _IOC_WRITE      2U
#define _IOC_READ       1U

#define _IOC(dir,type,nr,size) \
         (((dir)  << _IOC_DIRSHIFT) | \
          ((type) << _IOC_TYPESHIFT) | \
          ((nr)   << _IOC_NRSHIFT) | \
          ((size) << _IOC_SIZESHIFT))

unsigned int __invalid_size_argument_for_IOC = 0;
#define _IOC_TYPECHECK(t) \
         ((sizeof(t) == sizeof(t[1]) && \
           sizeof(t) < (1 << _IOC_SIZEBITS)) ? \
           sizeof(t) : __invalid_size_argument_for_IOC)

typedef unsigned long  UINT32;
typedef unsigned long  U32;

#define _T(arg) arg
#define TCHAR   char
#define MAX_PARAMS      256

typedef struct _VW_CMD_BLOCK
{
        U32                     ACK;
        U32                     Handle;
        U32                     RCode;          //0=good; otherwise with a error
code
        U32                     ParamsLen;      //in words (4 bytes)
        U32                     VWCmd;
        U32                     Params[MAX_PARAMS];
} VW_CMD_BLOCK;

static const unsigned char VW_MAGIC =   'v'|'w';
#define _IOWR _IOC(_IOC_READ|_IOC_WRITE,VW_MAGIC,0xA04,(_IOC_TYPECHECK(VW_CMD_BL
OCK)))

inline const TCHAR* IoCtlToStr(UINT32 ioCtlCode) {
        printf("IoCtlToStr(UINT32 ioCtlCode)");
        const TCHAR* ctlCodeStr;
        switch(ioCtlCode) {
        case _IOWR:
                ctlCodeStr = _T("VW_IOCTL_SEND_CMD");
                break;
        default:
                ctlCodeStr = _T("UNKNOWN_IOCTL");
                break;
        }
        return ctlCodeStr;
}

int main(void) {

        IoCtlToStr(2);

        return 0;
}

论坛徽章:
0
4 [报告]
发表于 2007-01-25 21:48 |只看该作者
不是编译器都说得很清楚了吗?
        case _IOWR: ???????????????????????
                ctlCodeStr = _T("VW_IOCTL_SEND_CMD");
                break;

论坛徽章:
0
5 [报告]
发表于 2007-01-26 14:20 |只看该作者

回复 4楼 upstorm 的帖子

主要是说“unsigned int __invalid_size_argument_for_IOC = 0;”不是常量,是个变量,
我改成“const unsigned int __invalid_size_argument_for_IOC = 0;”应该可以ok了,
但是如果修改linux/ioctl.h文件,需要重新编译内核吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP