2009年3月25日星期三

CCS编译报错说明

首先,CCS并不支持全部的标准C,有些用法CCS不支持,导致出一些看似正确却编译报错的问题。
比如这个错误:"common.h", line 360: error: identifier "DECLARE_ALIGNED" is
undefined
1.它在VC下有一个宏定义,是:DECLARE_ALIGNED( type, var, n )
__declspec(align(n)) type
var,就是说将以type类型的变量var以n字节对齐,现在移植的时候先不考虑DSP的对齐方式(2字节),直接定义变量:如下
DECLARE_ALIGNED( int, chroma_dc[2][4], 16 );
int, chroma_dc[2][4],
1.1.将define DECLARE_ALIGNED( type, var, n ) type var
__attribute__((aligned(n)))直接放到每个文件的开头也能消除这个错误.但这句代码不是已经在X264.H中定义过了吗?为什么还要重复定义呢?
2.在CCS的BUILD OPERATION中设置PREPROCESS中添加:__X264_
此时在"DECLARE_ALIGNED" is undefined的位置处出现这样的错误line 1620:
error: expected a ";"
1.3.#ifdef __X264__
# ifdef _MSC_VER
# define inline __inline
# define DECLARE_ALIGNED( type, var, n ) __declspec(align(n)) type
var
# define strncasecmp(s1, s2, n) strnicmp(s1, s2, n)
# else
# define DECLARE_ALIGNED( type, var, n ) type var
__attribute__((aligned(n)))
# endif

printf的两个需要注意的问题:无符号整数和64位整数

1) %d和%u的区别
unsigned int dwValue;
printf("%d", dwValue);
在dwValue的值大于0x7FFFFFFF时,输出的结果会变成负数。
正确的程序应该为:
printf("%u", dwValue);

2) 使用64位整数
LONGLONG llValue;
int iValue;
printf("%d, %d", llValue, iValue);
iValue的值永远不会被输出,第一个%d输出的是llValue的低32位,第二个%d输出的是llValue的高32位。所以程序应该修改为:
printf("%I64d, %d", llValue, iValue);

这两个例子体现了printf()的类型不安全性。如果printf()的参数的数据类型被修改,而格式字符串不作相应修改的话,这样的隐藏错误有时很难发现,所以更改数据类型时要注意检查是否需要修改相应的格式字符串,否则编译器连警告信息都不会出现。