typeofc语言
‘壹’ c语言define的一个函数看不懂。。有没有大神帮帮忙。非常感谢!!
C#的? typeof应该是取参数的类型,然后 定义了与入参同类型的__x和__d
( ( (typeof(x))-1) > 0 || ( (typeof(divisor))-1) > 0 || (__x) > 0) ?
(((__x) + ((__d) / 2)) / (__d)) :
(((__x) - ((__d) / 2)) / (__d));}
这里是简写 ,换成if语句就是
if( ((typeof(x))-1) > 0 || ((typeof(divisor))-1) > 0 || (__x) > 0 )
(((__x) + ((__d) / 2)) / (__d)) :
else
(((__x) - ((__d) / 2)) / (__d));
‘贰’ c语言中container_of, typeof, offsetof这些是哪个标准的
1. container_of是linux内核中实现的宏,不是C语言的标准函数。不能跨平台。
#define container_of(ptr, type, member) ({
const typeof( ((type *)0)->member ) *__mptr = (ptr);
(type *)( (char *)__mptr - offsetof(type,member) );})
2. typeof是GNU C的扩展,不是ISO标准中的函数。用gcc编译可以跨平台。
3. offsetof是C语言标准库中的宏,定义在头文件stddef.h中。可以跨平台。
‘叁’ C#中Typeof是干什么的
MSDN上typeof的说明:“用于获取类型的System.Type对象。”
typeof是操作符(一些书叫运算符),这点很重要。在C#中所有的操作符最后都变为函数了。这也就不奇怪为什么一个看似函数的东西却被称为操作符的原因了。
注意返回的是Type对象,内含有许多信息。如类型的信息。方法有哪些,属性有哪些,字段有哪些。如果用其它的技术,如反射、序列化什么的,配合使用的话会更方便。
(3)typeofc语言扩展阅读
typeof(x)中的x,必须是具体的类名、类型名称等,不可以是变量名称。
GetType()方法继承于Object(C#中所有类的基类都是object类。基类是相对于派生类而言的,比方说:如果B类继承自A类,则A就是B的基类。),所以C#中任何对象都具有GetType()方法,它的作用和typeof()相同,返回Type类型的当前对象的类型。
举例说明:
有这样一个变量i: Int32 i = new Int32();
i.GetType()返回值是Int32的类型,但是无法使用typeof(i),因为i是一个变量。如果要使用typeof(),则只能:typeof(Int32),返回的同样是Int32的类型。
Typeof()是运算符,用于获取类型的System.Type对象。而GetType是方法,获取当前实例的类型;Typeof()的参数只能是int,string,String,自定义类型,且不能是实例;
‘肆’ 各种C语言标准与区别
GNU C 允许零长度数组
GNU C 允许定义长度为0的数组,可能很多人会问长度为0的数组有什么用啊。其实我们可以定义一个长度为0的数组,那么这个数组是不占用内存空间的,但是 我们可以通过这个数组来访问数组后面的数据,比如一个结构体:
struct data_pra
{
char name;
char num[0];
char year;
charr month;
...
};
struct data_pra data;
就可以通过调用data.num[0]获得year数据,data.num[1]来获得month的数据。如果他们的类型相同,并且取值范围相同,我们要对他们进行范围检查,这是我们就可以通过for循环来实现,而不需要获取每个数据的值,再进行取值范围判断了。
GNU支持case 取值范围用法
GNU C 支持case x…y 语法,区间[x,y]的数都会满足这个case的条件,我们在不考虑if判断的情况下,如整数a的取值范围为0-5,当0<3时执行fun1函数,大于等于3时执行fun2();则GNU C可以通过以下代码实现:
switch(a)
{
case 0..: 2:fun1();
break;
case 3…5: fun2();
break;
}
而不是
switch(a)
{
case 0
case 1;
case 2:
fun1();
break;
case 3:
case 4;
case 5:
fun2();
break;
}
如果条件越多,这种实现方案就越简单方便。也便于其他人员阅读代码。
语句表达式
GNU C把包含在括号里的复合语句看做是一个表达式,称为语句表达式,它可以出现在任何允许表达式的地方。可以在语句表达式中使用原本只能在复合语句中使用的循环变量、局部变量等,例如:
#define min_t(type,x,y) ({type __x=(x); type __y=(y);__x<__y?__x:__y})
int ia,ib,mini;
mini=min_t(int,ia,ib);
这样,因为重新定义了__x和__y这两个局部变量,所以上述方法定义的宏将不会有副作用。在标准C中,对应的宏通常会有副作用
typeof关键字
typeof(x) 可以获得x的类型,因此,可以借助typeof重新定义上一条提到的min_t这个宏
#define min(x,y) /
({ /
const typeof(x) _x=(x);/
const typeof(y) _y=(y);/
(void) (&_x==&_y);/
_x<_y ? _x: _y ; })
不需要像上一条时那样传一个type进去,因为通过typeof(x)可以得到type。
代码 (void) (&_x==&_y);的作用是检查_x和_y的类型是否一致。
可变参数的宏
标准C只支持可变参数的函数,意味着函数的参数可以是不固定的
例如printf()函数的原型是
int printf(const char *format [,argument]…)
而在GNU C中,宏也可以接受可变数目的参数,例如
#define pr_debug(fmt,arg…) printk(fmt,##arg)
这里arg表示其余的参数可以是零个或多个,这些参数以及参数之间的逗号构成arg的值,
在宏扩展时替换arg ,例如
pr_debug(“%s:%d”,filename,line);
被扩展为
printk(“%s:%d”,filename,line);
使用##的原因是为了处理arg不代表任何参数的情况,这时候,前面的逗号就变得多余了。
使用##之后,GNU C预处理器会丢弃前面的逗号
pr_debug(“success!/n”) 会被正确扩展为 printk(“success!/n”)
而不是 printk(“success!/n”,);
‘伍’ 测试数据类型函数typeof( )的用法
typeof关键字是C语言中的一个新扩展。只要可以接受typedef名称,Sun Studio C 编译器就可以接受带有typeof的结构,包括以下语法类别: 声明 函数声明符中的参数类型链表和返回类型 类型定义 类型操作符s sizeof操作符 复合文字 typeof实参 编译器接受带双下划线的关键字:__typeof和__typeof__。本文中的例子并没有遵循使用双下划线的惯例。从语句构成上看,typeof关键字后带圆括号,其中包含类型或表达式的名称。这类似于sizeof关键字接受的操作数(与sizeof不同的是,位字段允许作为typeof实参,并被解释为相应的整数类型)。从语义上看,typeof 关键字将用做类型名(typedef名称)并指定类型。 使用typeof的声明示例 下面是两个等效声明,用于声明int类型的变量a。 typeof(int) a; /* Specifies variable a which is of the type int */ typeof('b') a; /* The same. typeof argument is an expression consisting of character constant which has the type int */以下示例用于声明指针和数组。为了进行对比,还给出了不带typeof的等效声明。 typeof(int *) p1, p2; /* Declares two int pointers p1, p2 */int *p1, *p2;typeof(int) * p3, p4;/* Declares int pointer p3 and int p4 */int * p3, p4;typeof(int [10]) a1, a2;/* Declares two arrays of integers */int a1[10], a2[10];如果将typeof用于表达式,则该表达式不会执行。只会得到该表达式的类型。以下示例声明了int类型的var变量,因为表达式foo()是int类型的。由于表达式不会被执行,所以不会调用foo函数。 extern int foo();typeof(foo()) var;使用typeof的声明限制 请注意,typeof构造中的类型名不能包含存储类说明符,如extern或static。不过允许包含类型限定符,如const或volatile。例如,下列代码是无效的,因为它在typeof构造中声明了extern: typeof(extern int) a;下列代码使用外部链接来声明标识符b是有效的,表示一个int类型的对象。下一个声明也是有效的,它声明了一个使用const限定符的char类型指针,表示指针p不能被修改。 extern typeof(int) b;typeof(char * const) p = "a";在宏声明中使用typeof typeof构造的主要应用是用在宏定义中。可以使用typeof关键字来引用宏参数的类型。因此,在没有将类型名明确指定为宏实参的情况下,构造带有所需类型的对象是可能的。
‘陆’ typeof是什么意思
typeof一般在程序中有运用。
typeof关键字是C语言中的一个新扩展,这个特性在linux内核中应用非常广泛。
typeof的参数可以是两种形式:表达式或类型。
‘柒’ C语言typeof用法报错,求指导
Work.Wells 是个 PWellList 类型,
根据:typedef TWellList* PWellList;
转换下,那就是:TWellList * 类型,即 TWellList 的指针。
就是说,*(TWork.Work) 才是 TWellList ,
所以, (*(TWork.Work))[1] == TWellList[1] ==(struct TWellData * ).
‘捌’ C语言 定义宏 求两个数的最大值
#include <stdio.h>
#define max(a,b) a>b?a:b
void main()
{
int i,j;
scanf("%d%d",&i,&j);
printf("%d\n",max(i,j));
}
‘玖’ 如何查看C语言数据类型占用字节大小
c语言有个操作符叫typeof,可以取得类型的大小