*c函数参数 char ios_c++ 函数 char** 怎么传参数 - CSDN
精华内容
参与话题
  • iOS:在objective-c 使用可变参数

    万次阅读 2014-08-25 15:42:34
    objective-c中已有的一些可变参数方法:
              objective-c中已有的一些可变参数方法:
    FOUNDATION_EXPORT  void NSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2);
    - (instancetype)initWithFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1,2);
    + (instancetype)arrayWithObjects:(id)firstObj, ... NS_REQUIRES_NIL_TERMINATION; // 注意区别

              在c/c++中使用可变参数参考《C/C++ 使用可变参数 & 原理》,在objective-c中使用情况也差不多,一些宏定义说明如下:

    ----------------------------------------------------------------------------------------------------------------------------------

           NS_FORMAT_FUNCTION(1,2)的意思:

    // NSObjCRuntime.h
    #if !defined(NS_FORMAT_FUNCTION)
        #if (__GNUC__*10+__GNUC_MINOR__ >= 42) && (TARGET_OS_MAC || TARGET_OS_EMBEDDED)
    	#define NS_FORMAT_FUNCTION(F,A) __attribute__((format(__NSString__, F, A)))
        #else
    	#define NS_FORMAT_FUNCTION(F,A)
        #endif
    #endif

               __attribute__,是GNU编译器的一个特性,这个宏是一个编译器指令,我们在代码中通过定义这个东西,可以inform编译器我们代码 的一些逻辑,从而在编译器避免一些错误,在运行期提高性能。__attribute__在很多代码中都有应用,非常实用。

              __attribute__ format ,这个东西能告知编译器,我们的代码在处理printf,scanf这样变参数的函数的时候,哪个参数是format string,哪个参数是参数列表,这样可以避免代码中的一些问题,比如:

    /* like printf() but to standard error only */
    extern void eprintf(const char *format, ...)
       __attribute__((format(printf, 1, 2)));  /* 1=format 2=params */
    
    /* printf only if debugging is at the desired level */
    extern void dprintf(int dlevel, const char *format, ...)
       __attribute__((format(printf, 2, 3)));  /* 2=format 3=params */
             从上面可以看出,我们定义了eprintf函数,第一个参数是Format String,第二个参数是对应Format String的参数列表,下面的dprintf也是一样,这样一来,编译器就能检测出下面这样的代码错误:
    1  extern void eprintf(const char *format, ...)
    2               __attribute__((format(printf, 1, 2)));
    3
    4  void foo()
    5  {
    6      eprintf("s=%s\n", 5);             /* error on this line */
    7
    8      eprintf("n=%d,%d,%d\n", 1, 2);    /* error on this line */
    9  }
    
    $ cc -Wall -c test.c
    test.c: In function `foo':
    test.c:6: warning: format argument is not a pointer (arg 2)
    test.c:8: warning: too few arguments for format
             其他一些__attribute__特性:__attribute__ const, 这个东西能告诉编译器,在给定参数的情况下,这个function始终返回同样的值。这样可以帮助程序提高性能,比如:
    extern int square(int n) __attribute__((const));
    ...
       for (i = 0; i < 100; i++ )
       {
          total += square(5) + i;
       }
            如果我们在square函数中没有定义__attribute__ const的话,在下面的那个循环中,程序每次都要产生一个调用square函数的代码。但是这里指定了const之后,程序就知道,对于同一个输入参数 5,返回值都是一样的。这样程序就会执行一次square,然后cache这个函数的return value,这样下次循环开始,对square函数的调用就没有函数调用的逻辑了,直接返回上次的结果

    ----------------------------------------------------------------------------------------------------------------------------------

           在objective-c中使用可变参数的例子:

    - (void)foo:(NSString *)format, ...
    {
        va_list args;
        va_start(args, format);
        NSString *str = [[NSString alloc] initWithFormat:format arguments:args];
        va_end(args); 
        printf([str UTF8String]); 
        [str release];
    }  
    - (IBAction) doo: (UIButton*) sender
    {
        //须留意不定参函数的调用格式,逗号分隔的序列,应该它们整体是作为函数的一个参数传入
        [self foo : @"My name %@, %@", @"Unmi", @"Yes"];
    }
    - (void)method:(NSString *)value,...
    {
        //指向变参的指针
        va_list list;
        //使用第一个参数来初使化list指针
        va_start(list, value);
        while (YES)
        {
            //返回可变参数,va_arg第二个参数为可变参数类型,如果有多个可变参数,依次调用可获取各个参数
            NSString *string = va_arg(list, NSString*);
            if (!string) {
                break;
            }
            NSLog(@"%@",string);
        }
        //结束可变参数的获取
        va_end(list);
    }
    

            函数调用:[self method:@"1",@"2",@"3",nil];像大多数变参函数一样,未尾一定要加上nil,因为这一组宏都没有提供对参数个数的检测,当然你可以会问为何NSLog的参数中我们都不用在末尾添加nil的参数呢,那是因为NSLog的第一个参数是一个格式化字符串,通过这个字条串就能获得后面的参数个数,所以如果你的函数还能有其它的参数能够显式的指出变参个数,当然你也可以书写(但在函数体中需要修改为按已知个数调用va_arg),仍然推荐以上的写法

    @interface sqlHelper : NSObject  
     {  
     }  
     -(int) executeInsertWithSql:(NSString *) statement, ...;  
    @end  
         .m文件  
    -(int) executeInsertWithSql:(NSString *) statement, ...  
    {  
        PLSqliteDatabase* dbPointer = [SqliteDataBase setUp];  
        argsArray = [[NSMutableArray alloc] init];  
        id arg;  
        va_list argList;  
        if(statement)  
                {  
                       va_start(argList,statement);  
                       while (arg = va_arg(argList,id))  
                       {  
                             [argsArray addObject:arg];  
                       }  
                       va_end(argList);  
                }   
                           BOOL bResult = [dbPointer executeUpdate:statement,[argsArray objectAtIndex:0],[argsArray  objectAtIndex:1]];  
                 return bResult;  
              }  
    // 在调用的时候要在参数结尾的时候加 nil
    sqlHelper *sqlCom = [[sqlHelper alloc] init];  
    [sqlCom executeInsertWithSql:@"INSERT INTO authorInfo(author,age) VALUES (?,?)",@"cheungching",@"25", nil]; 

    -(void)vaMethod:(id)object1, ...{
        va_list argList;
        id arg;
        if (object1) {
            va_start(argList, object1);
            while ((arg = va_arg(argList, id))) {
                NSLog(@"%@",arg);
            }
            va_end(argList);
        }
    }
    // 调用
    [self vaMethod:someObj,button,@"ss",nil];

            注意第一个参数为object1,之后才是可变参数列表。

    Disscussion:      

    --1.不定参数可以指定任何实际的类型,(id) 可真是任何类型了;

    --2.Objective-C 的不定参数,即 ... 也必须放在函数的最后面,如还有其他参数时,foo 要写成:

    - (void)fooState: (BOOL) enable withFormat: (NSString *)format, ...  
    - (void)fooFormat: (NSString *)format, ... withState: (BOOL) enable  // 错的

    --3.在调用的时候要不要在参数结尾的时候加 nil,回想下 [NSMutableArray arrayWithObjects: 1, 2, 3, nil] 这个构造过程,最后一个 nil 能让 va_arg 取参数时碰到 nil 则断定为 NO,终止循环。为何像 NSLog 调用不需要最后一个 nil?Because -stringWithFormat: and NSLog can infer the number of arguments based on their format strings (the first argument). -arrayWithObjects: can't.

    总结:在objective-c中使用可变参数格式为:(id)object1, ... 一般情况下object1为NSString类型,然后在方法内部使用va_start、va_arg等获取参数。至于调用的时候加不加nil,依赖于方法的实现,如果方法中以参数是否为nil作为结束条件(arg = va_arg(argList, id)为nil则va_end),则调用时必须加nil结尾。另外方法后可加一些宏定义(例如NS_FORMAT_FUNCTION(1,2))确定方法的一些格式,编译的时候对代码加以验证

    ------------------------------------------------------------------------------------------------------------------

    参考:

    1.http://unmi.cc/obejctive-c-var-arguments/ 《Obejctive-C 中定义可变参函数》

    2.http://mobile.51cto.com/iphone-280106.htm 《Objective-C可变参数函数定义》

    3.http://www.cnblogs.com/super119/archive/2011/04/05/2005592.html 《Using GNU C __attribute__ 阅读笔记》

     

    展开全文
  • 1、实现函数的可变形参1)、va_list:这是一个可变类型,用于定义指向可变参数列表的指针变量2)、va_start:让argList指向一个可变参数列表的第一个参数3)、提取argList当前指针指向的参数,并且将指针指向下一个参数4...

    1、实现函数的可变形参

    1)、va_list:这是一个可变类型,用于定义指向可变参数列表的指针变量

    2)、va_start:argList指向一个可变参数列表的第一个参数

    3)、提取argList当前指针指向的参数,并且将指针指向下一个参数

    4)、释放argList指针,结束提取




    2、测试代码

    Args.h

    #ifndef Args_h
    #define Args_h
    #import <Foundation/Foundation.h>
    @interface Args : NSObject
    -(void)test:(id)name, ...;
    @end
    #endif /* Args_h */

    Args.m

    #import <Foundation/Foundation.h>
    #import "Args.h"
    
    @implementation Args
    -(void)test:(id)name, ...
    {
        //va_list:这是一个可变类型,用于定义指向可变参数列表的指针变量
        va_list argList;
        if (name)
        {
            NSLog(@"%@", name);
            //va_start:让argList指向一个可变参数列表的第一个参数
            va_start(argList, name);
            //提取argList当前指针指向的参数,并且将指针指向下一个参数
            NSString *arg = va_arg(argList, id);
            while (arg)
            {
                NSLog(@"%@", arg);
                arg = va_arg(argList, id);
            }
            //释放argList指针,结束提取
            va_end(argList);
        }
    }
    @end



    main.m

    #import <UIKit/UIKit.h>
    #import "AppDelegate.h"
    #import "Person.h"
    #import "Apple.h"
    #import "User.h"
    #import "Args.h"
    #import "KVCPerson.h"
    
    int main(int argc, char * argv[]) {
        @autoreleasepool {
            Args *arg = [Args new];
            [arg test:@"chenyu", @"chenxuan", @"chencaifeng", nil];
     
        }
    }



    3、运行结果

    chenyu
    chenxuan
    chencaifeng


    4、对比总结

    这个oc里面和c语言里面的实现差不多如下面的代码

    #include <stdio.h>
    #include <stdarg.h>
    
    void PrintLines(char *first,...)
    {
        char *str;
        va_list v1;
        str = first;
        va_start(v1,first);
        do 
        {
            printf("%s\n",str);
            str=va_arg(v1,char*);
        } while (str != NULL );
        va_end(v1);
    }
    
    int main(int argc, char* argv[])
    {
        PrintLines("First1","Second2","Third3","Fourth4",NULL);
        return 0;
    }


    展开全文
  • //联系人:石虎 QQ:1224614774 昵称:嗡嘛呢叭... C语言~bzero函数  bzero(&tt,sizeof(tt)); // struct initialization to zero (结构体初始化到零)  bzero(s,20);  原型:extern void bzero(void *s, int

    //联系人:石虎 QQ:1224614774 昵称:嗡嘛呢叭咪哄


    一、iOS C语言~bzero函数


     bzero(&tt,sizeof(tt));// struct initialization to zero (结构体初始化到零)

     bzero(s,20);


       原型:extern void bzero(void *s,int n);

      用法:#include

      功能:置字节字符串s的前n个字节为零。

      说明:bzero无返回值。


    二、iOS C语言~memset函数


     char *s=“Shi HuView";

                clrscr();

                memset(s,’H’,4);


     原型:extern void *memset(void *buffer, int c, int count);

     用法:#include <string.h>

     功能:把buffer所指内存区域的前count个字节设置成字符c。

     说明:返回指向buffer的指针。



     注意:在memset和bzero初始化数据间,我很多时候选择bzero, memset的一个缺点是第二个参数和第三个参数需要记忆,需要记住哪个是值和哪个是大小(如果不想查手册的话), 不可以弄错。


    谢谢!!!

    展开全文
  • ---------------  main.m  --------------- #import void ...copyString(char* to , char* from) {  while(*from)  {  *to++ = *from++;  }  *to = '\0'; } int ma
    ---------------  main.m  ---------------
    #import <Foundation/Foundation.h>

    void copyString(char* to , char* from)
    {
         while(*from)
         {
              *to++ = *from++;
         }
         *to = '\0';
    }

    int main()
    {
       
    char* str = "www.crazyit.org";
        char dest[100];
        copyString(dest , str);
        NSLog(@"%s" , dest);
        copyString(dest , "Objective-C is Funny!");
        NSLog(@"%s" , dest);
    }

    一、编写本节代码的具体步骤:
    1.参照003节的代码编写步骤。

    二、本节代码涉及到的知识点:
    1.字符数组与字符指针的区别:
      ①定义字符数组时,系统会为每个数组元素分配内存空间;
        定义字符指针时(未赋值时),该指针所指向的内存空间是不确定的。
      ②字符数组只能在定义时赋值,不能先定义,再赋值。字符指针可以在定义时赋值,也可以先定义,再赋值。
      ③字符数组不允许重复赋值,字符指针允许重复赋值。(参见《疯狂iOS》第69页第126页)
    2.*to++ = *from++;的意思是,把from变量指向的字符赋给to变量指向的元素。
    展开全文
  • iOS基础知识:数组作为函数参数

    千次阅读 2016-03-07 21:27:40
    数组作为函数参数:  1.定义语法:   返回值类型  函数名(类型 数组名[]){     函数体;  } 例如: void array(int str[]){ str[0]=10; str[1]=20; }     注意:参数里数组名中括号的长度,可
  • IOS OC应用c的全局变量和全局函数

    万次阅读 2015-05-05 14:46:42
    // 定义数据结构的文件: TableInfo.h #ifndef TestMonitor_TableInfo_h #define TestMonitor_TableInfo_h typedef struct {  char * testName; }monitor_table; #endif *********************************
  • C++文件操作函数详解

    万次阅读 2012-02-19 10:34:10
    C++通过以下几个类支持文件的输入输出 (1) ofstream:写操作,输出文件类; (2) ifstream:读操作,输入文件类;...函数原型:void open(const char*filename,int mode,int access);  参数说明:
  • Unity3d与iOS交互开发——接入平台SDK必备技能

    万次阅读 多人点赞 2014-01-17 16:48:30
    那就需要Unity3d与iOS中Objective-C函数有交互,所以你就需要用到如下内容: 一、Unity3d To iOS: 1、创建一个C#文件 SdkToIOS.cs 这是调用iOS函数的接口: using System.Runtime.InteropServices; using ...
  • iOS和Unity交互之参数传递

    千次阅读 2018-06-22 10:27:14
    关于iOS和Unity交互的方法,进行简单的梳理.调用方法一: Unity调方法传参,有返回值. Unity代码: [DllImport(&quot;__Internal&quot;)] // 给iOS传string参数,有返回值,返回值通过iOS的return方法返回给Unity...
  • C++二进制文件读写

    万次阅读 2009-10-21 10:24:00
    今天终于弄明白怎样使用C++读写二进制文件了。要读取文件必须包含头文件,这里包含了C++读写文件的方法。...fstream file("test.dat",ios_base::in|ios_base::out|ios_base::app);另外一种方法就是使用open
  • 常用的C/C++文本文件的读写函数

    万次阅读 2015-12-29 23:41:14
    概述 文本文件的读写是算法研究和工程应用中常见的功能模块。...对C和C++分开介绍,目的是让大家即能用C++读写文本文件,又能用C读写文本文件。不多不少,恰到好处地掌握好该掌握的读写知识。 C读写
  • 打开文件在fstream类中,成员函数open()实现打开文件的操作,从而将数据流和文件进行关联,通过...函数:open()void open ( const char * filename, ios_base::openmode mode = ios_base::in | ios_base::ou
  • 就是int argc char *argv[ ] 这个是什么意思,怎么样进行传参的,求大神指点迷津。。。
  • 可运行于IOS的Python解释器

    万次阅读 2017-03-04 20:39:53
    本文一个运行于iphone的python解释器的例子,版本为python2.7,由于主要是为了...Iphone支持Object-C和C++代码混合编译,可以直接使用C++代码进行开发。  这里Python解释器基于cle开发,首先需要初始化cle,然后加
  • c++读写文件

    千次阅读 2013-01-28 21:00:41
    c++读写文件相关的类分别为ifstream(读文件) 和 ofstream(写文件) ifstream: ... ifstream( const char* szName, int nMode = ios::in, int nPort = filebuf::openprot);  2.创建一个ifstream对象,之后
  • C++ fstream详解

    万次阅读 多人点赞 2019-07-11 22:48:37
    C语言里面对文件的操作是通过文件指针,以及一些相关的函数,那么C++中是如何对文件进行操作的呢?没错,就是通过 fstream 这个文件流来实现的。当我们使用#include 时,我们就可以使用其中的 ifstream,ofstream以及...
  • iOS开发获取SDK下私有API

    万次阅读 2013-01-07 23:47:40
    Objecitve-C的重要特性是Runtime(运行时),在Interacting with the Runtime(交互运行... - c语言,通过其接口,可以用于开发将其他语言运行于Objective-C上的中间层(桥接层),库里的函数定义为纯C语言。 例如:cl
  • C++常用库函数

    万次阅读 多人点赞 2018-04-19 21:56:01
    C++常用库函数 1、常用数学函数 头文件 #include &lt;math&gt; 或者 #include &lt;math.h&gt; 函数原型 功能 返回值int abs(int x) 求整数x的绝对值 绝对值double acos(double x) 计算arcos(x)的...
  • open函数mode参数详解

    千次阅读 2017-09-25 19:20:19
    int open(const char* path, int oflag, .../* mode_t mode */) int openat(int fd, const char* path, int oflag, .../* mode_t mode */) 必选参数: O_RDONLY 只读打开 O_WRONLY 只写打开 O_RDWR 读写打开 O_E
  • unity3d与ios相互调用

    千次阅读 2016-07-08 17:17:19
    参考链接: http://www.tuicool.com/articles/Y7R3eyn
1 2 3 4 5 ... 20
收藏数 45,871
精华内容 18,348
关键字:

*c函数参数 char ios