精华内容
下载资源
问答
  • 函数名&函数名取地址

    千次阅读 2019-06-02 10:04:45
    按照&运算符本来的意义,它要求其操作数是一个对象,但函数名不是对象(函数是一个对象),本来&test是非法的,但很久以前有些编译器已经允许这样做,  c/c++标准的制定者出于对象的概念已经有所发展的缘故,也...

    有时看到如下的代码: 

    /*****************************/
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    void test()
    {
        printf("123456\n");
    }
    
    int main(int argc, char *argv[])
    {
        printf("0x%x\n",test);
        printf("0x%x\n",&test);
    }
    
    [root@localhost pht]# ./a.out 
    0x8048328
    0x8048328

    按照&运算符本来的意义,它要求其操作数是一个对象,但函数名不是对象(函数是一个对象),本来&test是非法的,但很久以前有些编译器已经允许这样做, 
    c/c++标准的制定者出于对象的概念已经有所发展的缘故,也承认了&test的合法性。 

    因此,对于test和&test你应该这样理解,test是函数的首地址,它的类型是void (),&test表示一个指向函数test这个对象的地址, 
    它的类型是void (*)(),因此test和&test所代表的地址值是一样的,但类型不一样。test是一个函数,&test表达式的值是一个指针! 


    跟此问题类似的还有对一个数组名取地址。 
    int a[100]; 
    printf("%p\n", a); 
    printf("%p\n", &a[0]); 

    打印值一样。 
    但是数组名a,指向的是具有100个int类型的组数; 
    &a[0]指向的是元素a[0]。 
    即他们的值相同,但指向的类型不同。 

    出处:https://my.oschina.net/mavericsoung/blog/174110

    展开全文
  • c语言变量名、函数名的命名规则

    万次阅读 多人点赞 2019-04-10 14:11:31
    (1)标识符的命名要清晰、明了,明确含义,同时使用完整的单词或大家基本可以理解的缩写,避免使人产生误解——尽量采用采用英文单词或全部中文全拼表示,若出现英文单词和中文混合定义时,使用连字符“_”将英文与...

    (1)标识符的命名要清晰、明了,有明确含义,同时使用完整的单词或大家基本可以理解的缩写,避免使人产生误解——尽量采用采用英文单词或全部中文全拼表示,若出现英文单词和中文混合定义时,使用连字符“_”将英文与中文割开。较短的单词可通过去掉“元音”形成缩写;较长的单词可取单词的头几个字母形成缩写;一些单词有大家公认的缩写。例如:temp->tmp、flag->标志寄存器、statistic->stat、increment->inc、message->msg等缩写能够被大家基本认可。
    (2)命名中若使用特殊约定或缩写,则要有注释说明。应该在源文件的开始之处,对文件中所使用的缩写或约定,特别是特殊的缩写,进行必要的注释说明。
    (3)自己特有的命名风格,要自始至终保持一致,不可来回变化。个人的命名风格,在符合所在项目组或产品组的命名规则的前提下,才可使用。(即命名规则中没有规定到的地方才可有个人命名风格)。
    (4)对于变量命名,禁止取单个字符(如i 、j 、k... ),建议除了要有具体含义外,还能表明其变量类型、数据类型等,但i 、j 、k 作局部循环变量是允许的。变量,尤其是局部变量,如果用单个字符表示,很容易敲错(如i写成j),而编译时又检查不出来,有可能为了这个小小的错误而花费大量的查错时间。
    (5)除非必要,不要用数字或较奇怪的字符来定义标识符。
    (6)命名规范必须与所使用的系统风格保持一致,并在同一项目中统一。
    (7)在同一软件产品内,应规划好接口部分标识符(变量、结构、函数及常量)的命名,防止编译、链接时产生冲突。对接口部分的标识符应该有更严格限制,防止冲突。如可规定接口部分的变量与常量之前加上“模块”标识等。
    (8)用正确的反义词组命名具有互斥意义的变量或相反作用的函数等。

    下面是一些在软件中常用的反义词组。

    add / remove begin / end create / destroy
    insert / delete first / last g et / release
    increment / decrement put / get
    add / delete lock / unlock open / close
    min / max old / new start / stop
    next / previous source / target show / hide
    send / receive source / destination
    cut / paste up / down
    示例:
    intmin_sum;
    intmax_sum;
    intadd_user( BYTE *user_name );
    intdelete_user( BYTE *user_name );

     

    (9)除了编译开关/ 头文件等特殊应用,应避免使用_EXAMPLE_TEST_ 之类以下划线开始和结尾的定义。


    变量名的命名规则

    (1)变量的命名规则要求用“匈牙利法则”。
    即开头字母用变量的类型,其余部分用变量的英文意思、英文的缩写、中文全拼或中文全拼的缩写,要求单词的第一个字母应大写。
    即: 变量名=变量类型+变量的英文意思(或英文缩写、中文全拼、中文全拼缩写)
    对非通用的变量,在定义时加入注释说明,变量定义尽量可能放在函数的开始处。
    见下表:

     

    bool 用b开头 b标志寄存器
    int 用i开头 iCount
    short int 用n开头 nStepCount
    long int 用l开头 lSum
    char用c开头 cCount
    unsigned char 用by开头
    float 用f开头 fAvg
    double 用d开头 dDeta
    unsigned int(WORD) 用w开头 wCount
    unsigned long int(DWORD) 用dw开头 dwBroad
    字符串 用s开头 sFileName
    用0结尾的字符串 用sz开头 szFileName

     

    (2)指针变量命名的基本原则为:

    对一重指针变量的基本原则为:“p”+变量类型前缀+命名,如一个float*型应该表示为pfStat。对二重指针变量的基本规则为:“pp”+变量类型前缀+命名。对三重指针变量的基本规则为:“ppp”+变量类型前缀+命名。
    (3)全局变量用g_开头,如一个全局的长型变量定义为g_lFailCount。即:变量名=g_+变量类型+变量的英文意思(或缩写)。此规则还可避免局部变量和全局变量同名而引起的问题。
    (4)静态变量用s_开头,如一个静态的指针变量定义为s_plPerv_Inst。即: 变量名=s_+变量类型+变量的英文意思(或缩写)
    (5)对枚举类型(enum)中的变量,要求用枚举变量或其缩写做前缀。并且要求用大写。如:

     

    enum cmEMDAYS
    {
    EMDAYS_MONDAY;
    EMDAYS_TUESDAY;
    ……
    };

     

    (6)对struct、union变量的命名要求定义的类型用大写。并要加上前缀,其内部变量的命名规则与变量命名规则一致。
    结构一般用S开头,如:

    struct ScmNPoint
    {
    int nX;//点的X位置
    int nY; //点的Y位置
    };

    联合体一般用U开头,如:

    union UcmLPoint
    {
    LONG lX;
    LONG lY;
    }

    (7)对常量(包括错误的编码)命名,要求常量名用大写,常量名用英文表达其意思。当需要由多个单词表示时,单词与单词之间必须采用连字符“_”连接。

    如:#define CM_FILE_NOT_FOUND CMMAKEHR(0X20B) 其中CM表示类别。

    (8)对const 的变量要求在变量的命名规则前加入c_。即:c_+变量命名规则;示例:const char* c_szFileName;

     

    函数的命名规范

    (1)函数的命名应该尽量用英文(或英文缩写、中文全拼、中文全拼缩写)表达出函数完成的功能——函数名应准确描述函数的功能。遵循动宾结构的命名法则,函数名中动词在前,并在命名前加入函数的前缀,函数名的长度不得少于8个字母。函数名首字大写,若包含有两个单词的每个单词首字母大写。如果是OOP 方法,可以只有动词(名词是对象本身)。示例:

    LONG GetDeviceCount(……);
    void print_record( unsigned int rec_ind ) ;
    intinput_record( void ) ;
    unsigned char get_current_color( void ) ;

    (2)避免使用无意义或含义不清的动词为函数命名。如使用process、handle等为函数命名,因为这些动词并没有说明要具体做什么。

    (3)必须使用函数原型声明。函数原型声明包括:引用外来函数及内部函数,外部引用必须在右侧注明函数来源: 模块名及文件名;内部函数,只要注释其定义文件名——和调用者在同一文件中(简单程序)时不需要注释。
    应确保每个函数声明中的参数的名称、类型和定义中的名称、类型一致。


    函数参数命名规范

    (1)参数名称的命名参照变量命名规范。
    (2)为了提高程序的运行效率,减少参数占用的堆栈,传递大结构的参数,一律采用指针或引用方式传递。
    (3)为了便于其他程序员识别某个指针参数是入口参数还是出口参数,同时便于编译器检查错误,应该在入口参数前加入const标志。

    如:……cmCopyString(const CHAR * c_szSource, CHAR * szDest)

    文件名(包括动态库、组件、控件、工程文件等)的命名规范文件名的命名要求表达出文件的内容,要求文件名的长度不得少于5个字母,严禁使用象file1,myfile之类的文件名。

    展开全文
  • 什么C++有函数重载

    千次阅读 2015-06-15 10:02:56
    1、首先,我们需要了解的是,在c中,要求在同一个作用域中,函数名唯一。就是不允许函数同名。 而在C++中,要求同一个作用域中函数签名唯一。函数签名是函数名+参数列表。就是说允许函数名相同但参数列表不同...

    为什么C++支持函数重载?
    1、首先,我们需要了解的是,在c中,要求在同一个作用域中,函数名唯一。就是不允许函数同名。
    而在C++中,要求同一个作用域中函数签名唯一。函数签名是函数名+参数列表。就是说允许函数名相同但参数列表不同的函数存在。可见,函数重载跟返回类型没什么关系。
    2、那么为什么C++允许函数签名唯一呢?
    代码段在被编译器编译的时候,会根据函数名生成函数的调用地址。
    C编译器编译之后,函数名不变。
    而C++编译器编译之后,函数名就会发生命名置换。比如说代码中的函数是

    int function(int a,int b,double c)
    	{
    		cout<<a<<b<<c<<endl;
    	}
    


    gcc编译,命名置换后,会变成_Z8functioniid。
    其中_Z是gcc编译器的保留字,不同的编译器,生成的保留字也会不一样,8是函数名的字符数量,iid则是参数列表的缩写。
    经过这样一个操作时候,即使是函数名相同,但只要参数列表不同,那么编译之后生成的函数名实际上是不同的。
    3、需要注意的是,函数名会发生命名置换,同样,函数调用时也会发生置换。比如说:

    int main()
    	{
    		function(2,5,2.36);
    	}
    

     
    

    这时,如果在C++中发生调用,不会出现问题。可是,如果是在C中调用,那么C的编译器是找不到经过C++编译器命名置换的函数地址的。因为C编译器没有命名置换,他调用的还是function这个函数名。于是出现了extern "C"这个关键字是告诉C++编译器不用命名替换,用C编译器的方式去编译。

    extern "C"
    {
    	int function(int a,int b,double c)
    	{
    		cout<<a<<b<<c<<endl;
    	}
    	int main()
    	{
    		function(2,5,2.36);
    	}
    };
    

     这样就不会出现问题了。

    展开全文
  • Python3 根据函数名动态调用函数

    千次阅读 2019-07-02 21:18:48
    最近项目需求,需要动态调用函数,这里整理一下思路。 很多时候,我们需要根据外面传...要动态调用,如果是在同一个模块(.py)中,直接使用eval(function_name)(param(如果的话))。如果是在一个模块中动态调用...

    最近项目需求,需要动态调用函数,这里整理一下思路。

    很多时候,我们需要根据外面传进来的字符串取动态调用函数,并获取返回值。例如单项目检查等,检查的类型可以事先在定义文件中配置好,这样后期维护的时候,如果需要修改,直接修改配置文件就好了,而不必修改代码。要动态调用,如果是在同一个模块(.py)中,直接使用eval(function_name)(param(如果有的话))。如果是在一个模块中动态调用另一个模块中的函数,则需要使用 importlib 包。这里主要介绍 eval 用法, importlib 包的具体用法后面再做追加。

    事先定义多个方法:

    # 检查文本类型是否为字符串
    # @param text 文本
    # @return True:是,False:不是
    def __string(text):
        return True if isinstance(text, str) else False
    
    
    # 检查文本类型是否为浮点型
    # @param text 文本
    # @return True:是,False:不是
    def __float(text):
        if __string(text):
            try:
                return True if float("{0}".format(text)) else False
            except Exception:
                return False
        else:
            return True if isinstance(text, float) else False
    
    
    # 检查文本类型是否为浮点型
    # @param text 文本
    # @return True:是,False:不是
    def __int(text):
        if __string(text):
            try:
                return True if float("{0}".format(text)) else False
            except Exception:
                return False
        else:
            return True if isinstance(text, float) else False
    
    
    # 检查文本类型是否为数字型
    # @param text 文本
    # @return True:是,False:不是
    def __number(text):
        return True if re.search("[^0-9]", text) == None else False

    然后再写一个函数来可以动态的调用这些函数(根据函数名字符串):

    # 项目check
    # @param tag 标签名
    # @param text 文本
    # @return True:OK, False:NG
    def item_check(func_name, text):
        if type and text:
            try:
                # 调用导入模块中的函数,并传参
                return eval("__{0}".format(func_name))(text)
            except Exception:
                return False
        else:
            return False

    现在,我们来测试一下这样的方法是否正确可用:

    result = item_check("number", "123456")
        print("{0}是否为{1}:{2}".format("123456", "number", result))

    运行程序,控制台输出:

    123456是否为number:True

    Process finished with exit code 0

    说明我们的动态调用是OK的。

    下面是完整的代码:

    文件:item_check.py

    import re
    
    
    # 检查文本类型是否为字符串
    # @param text 文本
    # @return True:是,False:不是
    def __string(text):
        return True if isinstance(text, str) else False
    
    
    # 检查文本类型是否为浮点型
    # @param text 文本
    # @return True:是,False:不是
    def __float(text):
        if __string(text):
            try:
                return True if float("{0}".format(text)) else False
            except Exception:
                return False
        else:
            return True if isinstance(text, float) else False
    
    
    # 检查文本类型是否为浮点型
    # @param text 文本
    # @return True:是,False:不是
    def __int(text):
        if __string(text):
            try:
                return True if float("{0}".format(text)) else False
            except Exception:
                return False
        else:
            return True if isinstance(text, float) else False
    
    
    # 检查文本类型是否为数字型
    # @param text 文本
    # @return True:是,False:不是
    def __number(text):
        return True if re.search("[^0-9]", text) == None else False
    
    
    # 项目check
    # @param tag 标签名
    # @param text 文本
    # @return True:OK, False:NG
    def item_check(func_name, text):
        if type and text:
            try:
                # 调用导入模块中的函数,并传参
                return eval("__{0}".format(func_name))(text)
            except Exception:
                return False
        else:
            return False
    
    
    if __name__ == "__main__":
        result = item_check("number", "123456")
        print("{0}是否为{1}:{2}".format("123456", "number", result))

     

    展开全文
  • C++函数名的修饰规则

    千次阅读 2016-05-21 20:30:52
    我们知道在C++中函数重载这样一个东西,当我们定义了几个功能类似且函数名是一样的函数的时候,只要它的参数列表不同,编译是可以通过的,但是在C中是不可以的。   double add(double a, double b) { ...
  • C语言中函数名的意义深究

    千次阅读 2018-08-26 22:50:06
    一、通常的函数调用 一个通常的函数调用的例子: /* 自行包含头文件 */ void MyFun(int x); /* 此处的声明也可写成:void MyFun(int) */ int main(int argc, char* argv[]) {  MyFun(10); /* 这里是调用MyFun(10) ...
  • 良好的代码风格中,eslint要求函数名与括号间要一个空格,如下: 但是使用webstorm的格式化代码的快捷键却没有能实现这种功能,具体的设置方法如下: 打开&quot;setting&quot;–&amp;gt;“code style...
  • python 函数名大小写

    千次阅读 2019-02-14 09:36:12
    # -*- coding:utf-8 -*- class Solution: # array 二维列表 def Find(self, target, array): # write code here n = len(array) flag = 'false' if array == [[]]: ...
  • c语言输出文件名函数名和行号

    千次阅读 2014-07-24 18:09:06
    在后台程序运行出问题时,详尽的日志是抓错不可缺少的帮手,这里提供一个能自动记录日志触发点文件名、行号、函数名的方法,关键是利用C99新增的预处理标识符__VA_ARGS__ 先介绍几个编译器内置的宏定义,这些宏...
  • 函数

    千次阅读 2016-07-19 11:06:55
    一、认识函数前面我们学习了程序设计中的三个基本控制结构(顺序、分支、循环),用它们可以组成任何程序,但在应用中,我们还要学习子程序结构。 通常在程序设计当中,我们会发现一些程序段在程序的不同地方反复...
  • 那么,回调函数是个什么鬼呢?它和函数到底何异同?既然已经函数,为啥还非要生出个回调函数来?想必,小伙伴们在刚碰到这个概念的时候,都会被这些问题困扰。网上搜一搜,很多相关的材料,但是未必透彻。我...
  • Python2.7中input和raw_input函数有什么区别
  • 中断服务函数的编写要求

    千次阅读 2014-10-22 10:58:16
    中断是嵌入式系统中重要的组成部分,但是在...当一个函数被定义为ISR的时候,编译器会自动为该函数增加中断服务程序所需要的中断现场入栈和出栈代码。  中断服务程序需要满足如下要求:  (1)不能返回值;  (2)
  • 函数名>(<参数表>)=0;   …   };   在许多情况下,在基类中不能对虚函数给出意义实现,而把它说明为纯虚函数,它的实现留给该基类的派生类去做。这就是纯虚函数的作用。 ...
  • 虚函数的定义是:在基类中用关键词“virtual”声明成员函数,然后在派生类中正式定义或重新定义此函数,其中要求函数名、函数类型、参数类型和个数必须与基类虚函数相同。 所以函数重载和虚函数在概念上的最大差别...
  • tabs 涉及到多个tabs时,如果在同一个center页面layout中显示,如果相同的变量名称或者函数名称时,会导致异常,操作的不是同一个tab内面的内容。如用户管理、角色管理、菜单管理中都appendFun() editFun()函数...
  • <br />出自:http://blog.codingnow.com/2010/03/object_oriented_programming_in_c.html<br />在 C 语言中,void (*foo)() ...如果你想定义一个不接受参数的函数,并让编译器帮你检查出那些错误的多传递了参数
  • 函数

    千次阅读 多人点赞 2015-12-17 22:37:05
    指向基类的指针在操作它的多态类对象时,会根据不同的类对象调用其相应的函数,这个函数就是虚函数,虚函数用virtual修饰函数名。虚函数的作用是在程序的运行阶段动态地选择合适的成员函数。在派生类中重新定义的...
  • 函数类型 operator 运算符(形参表)  {   函数体; {  譬如++运算符的重载为: class lei{ friend lei operator++(const lei& ); } 调用的时候 lei entity = lei(); ...
  • 数组作为函数参数

    万次阅读 2011-01-11 12:01:00
     用数组函数参数与用数组元素作实参几点不同: (1)用数组元素作实参时,只要数组类型和函数的形参变量的类型一致,那么作为下标变量的数组元素的类型也和函数形参变量的类型是一致的。...
  • 如果你远程连接服务器报这个错误,这是由于你的计算机最近更新了,导致无法登陆,解决方法两个,第一个是打开WIN+R输入gpedit.msc,然后进行操作,但是这种方法不适用windows家庭版,这种方法百度也很多,我就不...
  • MySQL函数

    万次阅读 2019-04-03 15:29:19
    MySQL函数  MySQL数据库提供了很多函数包括: 数学函数; 字符串函数; 日期和时间函数; 条件判断函数; 系统信息函数; 加密函数; 格式化函数; 一、数学函数  数学函数主要用于处理数字,包括整型、...
  • 1.虚方法其目的就是为了重写,但它可以自己的实现部分。 2.抽象方法:其为抽象,很好理解,其不能提供具体的实现,只是一个可重写的(隐性的)虚方法的(可以理解为接口)模版。 3.这两个方法都是为了再次重写...
  • 函数定义的一般形式1.无参函数的一般形式 类型说明符... 函数名是由用户定义的标识符,函数名一个空括号,其中无参数,但括号不可少。{} 中的内容称为函数体。在函数体中也类型说明, 这是对函数体内部所用到的变
  • 什么情况下要拷贝构造函数

    千次阅读 2009-10-16 15:47:00
    拷贝构造函数,经常被称作X(X&),是一种特殊的构造函数,他由编译器调用来完成一些基于同一类的其他对象的构件及初始化。它的唯一的一个参数(对象的引用)是不可变的(因为是const型的)。这个函数经常用在函数调用...
  • 函数重载是指在同一作用域内,可以一组具有相同函数名,不同参数列表的函数,这组函数被称为重载函数。那为什么不可以是函数名相同,参数列表相同,函数的返回值不同呢? 2. 从一个函数重载实例说起   ...
  • 查看关于c编程的书籍可以知道,在函数调用之前,要求先声明,这是为了告诉编译器函数返回值的类型,函数接受的参数的类型和个数。而如果函数在调用之前已经定义好了,即编译器知道函数的... 返回值 函数名 (参数类型
  • 出现身份验证错误,要求函数不受支持。。。 解决办法: 1、按Windows键+R,或者在CMD命令窗口,输入“运行”,打开运行窗口, 2、输入regedit,打开注册表编辑器, 找到路径:计算机\HKEY_LOCAL_MACHINE...
  • 重载函数,例题

    千次阅读 2019-04-14 20:40:38
    一个程序中,多个函数如果具有相同的函数名,这些函数可以完成不同的功能,并不同的参数个数或参数类型,这些函数就叫做重载函数,也就是说,函数重载时,要求函数的参数个数或参数类型不同,也就是行参列表必须...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 710,411
精华内容 284,164
关键字:

函数名有什么要求