가변 함수
Variadic function수학과 컴퓨터 프로그래밍에서, 변수 함수는 가변적인 수의 인수를 수용하는, 즉 무한 동일성의 함수이다.가변 함수에 대한 지원은 프로그래밍 언어마다 크게 다릅니다.
varadic이라는 용어는 1936-1937년으로 [1]거슬러 올라가는 신조어이다.이 용어는 1970년대까지 널리 사용되지 않았다.
개요
다양한 함수로서 자연스럽게 접하게 되는 많은 수학 및 논리 연산이 있습니다.예를 들어, 숫자의 합계나 문자열 또는 기타 시퀀스의 결합은 임의의 수의 오퍼랜드에 적용할 수 있다고 생각할 수 있는 연산입니다(이 경우 관련 속성이 정식으로 적용되더라도).
많은 언어에서 가변 함수로 구현된 또 다른 작업은 출력 포맷입니다.C 함수와 공통 리스프 함수는 이러한 두 가지 예입니다.둘 다 출력 포맷을 지정하는1개의 인수와 포맷할 값을 제공하는 임의의 수의 인수를 사용합니다.
가변 함수는 일부 언어에서 유형 안전 문제를 노출시킬 수 있습니다.예를 들어 C의printf
부주의하게 사용하면 포맷스트링 공격이라고 불리는 보안 홀 클래스가 발생할 수 있습니다.이 공격은 Variadic 함수에 대한 언어 지원이 타입 세이프가 아니기 때문에 가능합니다.이것에 의해, 함수는, 스택에 배치되어 있던 것보다 더 많은 인수를 스택으로부터 팝 하려고 하고, 스택이 파손되어 예기치 않은 동작이 발생합니다.그 결과 CERT 조정 센터는 C의 다양한 기능을 높은 보안 [2]위험으로 간주합니다.
함수 언어에서 바리에이딕스는 함수 및 목록/시퀀스/배열을 인수로 하여 목록에 제공된 인수를 사용하여 함수를 호출하여 가변 수의 인수를 [citation needed]함수에 전달하는 적용 함수를 보완하는 것으로 간주할 수 있다.함수 언어 Haskell에서는 유형 클래스의 값을 반환함으로써 가변 함수를 구현할 수 있다. T
;의 인스턴스T
최종 수익률입니다.r
및 함수(T t) => x -> t
이를 통해 임의의 수의 인수를 추가할 수 있습니다.x
를 클릭합니다.[further explanation needed]
용어개서연구에서 관련된 주제를 위험회피 또는 [3]위험회피변수라고 한다.변수가 있는 함수인 변종과 달리, 헤지는 변수 자체의 순서이다.또한 변수 길이가 아닌 지점(예: 'take 4 arguments')까지 제약('take 4 arguments')을 가질 수 있으므로 이를 변종이라고 부르는 것은 오해의 소지가 있습니다.그러나 이들은 동일한 현상을 언급하고 있으며, 때로는 문구가 혼합되어 가변 변수(헤지와 동의어)와 같은 이름이 생기기도 합니다.변수라는 단어의 이중적인 의미와 함수 프로그래밍 및 용어 개서에서의 인수와 변수 간의 차이점에 유의하십시오.예를 들어, 용어(기능)는 세 가지 변수(위험회피 중 하나)를 가질 수 있으며, 따라서 용어는 세 가지 이상의 인수를 취할 수 있다(위험회피가 비어 있는 경우 둘 이상).
예
주식회사
C 프로그래밍 언어로 가변 함수를 이식 가능하게 구현하기 위해 표준 헤더 파일이 사용됩니다.이전 헤더는 다음 이유로 폐지되었습니다.stdarg.h
C++에서는 헤더 파일cstdarg
사용됩니다.[4]
#실패하다 <stdarg.h> #실패하다 <stdio.h> 이중으로 하다 평균(인트 세어보세요, ...) { va_list ap; 인트 j; 이중으로 하다 합 = 0; va_start(ap, 세어보세요); /* 마지막 고정 파라미터가 필요합니다(주소를 취득하려면).*/ 위해서 (j = 0; j < > 세어보세요; j++) { 합 += va_module(ap, 인트); /* 다음 인수로 ap을 늘립니다.*/ } va_end(ap); 돌아가다 합 / 세어보세요; } 인트 주된(인트 argc, 차 컨스턴트 *argv[]) { 인쇄물(%f\n", 평균(3, 1, 2, 3)); 돌아가다 0; }
그러면 임의 개수의 인수의 평균이 계산됩니다.함수는 인수 수 또는 인수 유형을 인식하지 않습니다.위의 함수는 유형이 다음과 같을 것으로 예상합니다.int
인수 수가 첫 번째 인수로 전달되는 것(이것은 빈번한 사용법이지만 언어나 컴파일러에 의해 강제되는 것은 아닙니다).다른 경우, 예를 들어 printf는 형식 문자열에서 인수의 수와 유형을 파악합니다.두 경우 모두, 이것은 프로그래머가 올바른 정보를 제공하느냐에 달려 있습니다. (또는, 다음과 같은 sentinel 값)NULL
를 사용하여 번호를 나타낼 수 있습니다).함수가 인식하는 것보다 적은 인수가 전달되거나 인수의 유형이 올바르지 않은 경우 이 인수가 메모리의 비활성 영역으로 읽혀져 포맷 문자열 공격 등의 취약성이 발생할 수 있습니다.
stdarg.h
타입을 선언합니다.va_list
, 및 4개의 매크로, , 및 를 정의합니다.각 기동 시va_start
그리고.va_copy
대응하는 호출에 의해 일치해야 한다va_end
변수 인수를 사용할 때 함수는 보통 유형의 변수를 선언합니다.va_list
(ap
이 예에서는, 매크로에 의해서 조작됩니다.
va_start
2개의 인수를 사용합니다.va_list
객체와 함수의 마지막 매개 변수(줄임표 앞에 있는 매개 변수, 매크로에서는 이 매개 변수를 사용하여 베어링을 가져옵니다)에 대한 참조입니다.초기화를 합니다.va_list
사용 목적va_arg
또는va_copy
컴파일러는 참조가 올바르지 않은 경우(예: 마지막 파라미터와 다른 파라미터에 대한 참조 또는 완전히 다른 오브젝트에 대한 참조) 보통 경고를 보내지만 컴파일이 정상적으로 완료되는 것을 막지는 않습니다.va_arg
2개의 인수를 사용합니다.va_list
개체(초기화) 및 유형 기술자.다음 변수 인수로 확장되며 지정된 유형을 가집니다.의 연속 호출va_arg
각 변수 인수를 차례로 처리할 수 있습니다.유형이 올바르지 않거나 다음 변수 인수가 없는 경우 지정되지 않은 동작이 발생합니다.va_end
1개의 인수를 채택합니다.va_list
물건.그것은 청소하는 역할을 한다.예를 들어 변수 인수를 여러 번 스캔하고 싶은 경우 프로그래머는 다음을 다시 초기화합니다.va_list
호출에 의한 오브젝트va_end
그리고 나서.va_start
또 시작이야va_copy
둘 다 두 개의 주장을 받아들인다va_list
물건들.두 번째(초기화되어야 함)를 첫 번째(초기화되어야 함)로 복제합니다."변수 인수를 두 번 이상 스캔" 예시로 돌아가면 호출을 통해 이 작업을 수행할 수 있습니다.va_start
첫 번째로va_list
, 그 후 사용va_copy
1초에 복제하다va_list
variable 인수를 처음 스캔한 후va_arg
그리고 첫 번째va_list
(와 함께)va_end
프로그래머는 변수 인수를 두 번째로 스캔할 수 있습니다.va_arg
그리고 두 번째va_list
잊지 말고va_end
복제품va_list
.
인 C#
C#에서는, 다음의 명령어를 사용해, Variadic 함수를 설명합니다.params
키워드를 지정합니다.단, 인수에는 유형을 지정해야 합니다.object[]
캐치올로 사용할 수 있습니다.
사용. 시스템.; 학급 프로그램. { 정적인 인트 푸우(인트 a, 인트 b, 파라미터 인트[] args) { // a와 b를 무시하고 arg의 정수 합계를 반환합니다. 인트 합 = 0; 앞지르다 (인트 i 에 args) 합 += i; 돌아가다 합; } 정적인 무효 주된(스트링[] args) { 콘솔.기입선(푸우(1, 2)); // 0 콘솔.기입선(푸우(1, 2, 3, 10, 20)); // 33 } }
C++의 경우
C++의 기본적인 바리어스 기능은 C의 것과 거의 동일합니다.유일한 차이점은 구문에서 생략 부호 앞에 있는 쉼표를 생략할 수 있습니다.
#실패하다 <iostream> #실패하다 <cstdarg> 무효 simple_printf(컨스턴트 차* fmt...) // C-style "const char* fmt, ..."도 유효합니다. { va_list args; va_start(args, fmt); 하는 동안에 (*fmt != '\0') { 한다면 (*fmt == 'd') { 인트 i = va_module(args, 인트); 표준::외치다 << > i << > '\n'; } 또 다른 한다면 (*fmt == 'c') { // 적분형 자동 변환 주의 인트 c = va_module(args, 인트); 표준::외치다 << > static_cast< >차>(c) << > '\n'; } 또 다른 한다면 (*fmt == 'f') { 이중으로 하다 d = va_module(args, 이중으로 하다); 표준::외치다 << > d << > '\n'; } ++fmt; } va_end(args); } 인트 주된() { simple_printf("dcff", 3, 'a', 1.999, 42.5); }
Variadic 템플릿(파라미터 팩)은 C++에서도 언어가 내장된 폴드 식과 함께 사용할 수 있습니다.
#실패하다 <iostream> 템플릿 < >타이프네임... Ts> 무효 foo_프린트(Ts... args) { ((표준::외치다 << > args << > ' '), ...); } 인트 주된() { 표준::외치다 << > 표준::부루알파; foo_프린트(1, 3.14f); // 1 3.14 foo_프린트("푸", 'b', 진실의, 특수); // Foo b true nullptr }
C++의 CERT 부호화 규격에서는 [5]오사용 위험이 낮기 때문에 C++의 바리에이딕 템플릿(파라미터 팩) 사용을 C-스타일 바리에이딕 함수보다 선호합니다.
인고
Go의 Variadic 함수는 임의의 수의 후행 [6]인수를 사용하여 호출할 수 있습니다. fmt.Println
는 일반적인 바리에딕 함수입니다.빈 인터페이스를 catch-all 타입으로 사용합니다.
패키지 주된 수입품 "fmt" // 이 variadic 함수는 임의의 수의 int를 인수로 받습니다. 기능하다 합(숫자 ...인트) { fmt.인쇄('합계', 숫자) // 가변 함수이기도 합니다. 총 := 0 위해서 _, 숫자 := 범위 숫자 { 총 += 숫자 } fmt.인쇄("는, 총) // 가변 함수이기도 합니다. } 기능하다 주된() { // Variadic 함수는 개별적으로 통상적인 방법으로 호출할 수 있습니다. // 인수. 합(1, 2) // "[1 2]의 합은 3" 합(1, 2, 3) // "[1 2 3]의 합은 6" // 슬라이스에 이미 여러 개의 Arg가 있는 경우 이를 바리에이드에 적용합니다. // func(func)를 사용하여 다음과 같이 기능합니다. 숫자 := []인트{1, 2, 3, 4} 합(숫자...) // "[1 2 3 4]의 합계는 10" }
출력:
[1 2]의 합은 3이고 [1 2 3]의 합은 6이고 [1 2 3 4]의 합은 10입니다.
자바어
C#과 마찬가지로Object
type in Java는 캐치올로 사용할 수 있습니다.
일반의 학급 프로그램. { // Variadic 메서드는 받은 추가 인수를 배열에 저장합니다. // 결과적으로 'printArgs'는 실제로는 하나의 파라미터가 있는 메서드입니다. // String의 가변 길이 배열. 사적인 정적인 무효 프린트 아그(스트링... 줄들) { 위해서 (스트링 스트링 : 줄들) { 시스템..나가..인쇄(스트링); } } 일반의 정적인 무효 주된(스트링[] args) { 프린트 아그("안녕하세요"); // printArgs(["hello"])의 줄임말 프린트 아그("안녕하세요", "세계"); // printArgs(["hello", "world")의 줄임말 } }
자바스크립트
기능. 합(...숫자) { 돌아가다 숫자.줄이자((a, b) => a + b, 0); } 콘솔.로그.(합(1, 2, 3)); // 6 콘솔.로그.(합(3, 2)); // 5 콘솔.로그.(합()); // 0
JavaScript는 변수 유형에 상관하지 않습니다.인수 Object를 사용하여 변수 함수를 만드는 다른 방법도 있지만 "function" 키워드로 작성된 함수에서만 사용할 수 있습니다.
기능. 추가(숫자){ 허락하다 합=숫자; 위해서(i=1;i< >논쟁들.길이;i++){ 합+=숫자+논쟁들[i] } 돌아가다 합; } 콘솔.로그.(추가(5,5,5,5,5)) //25
Pascal에서
![]() |
Pascal에는 4개의 프로시저가 내장되어 있으며, 이러한 프로시저는 이 특별한 조건 때문에 컴파일러 고유의 것입니다.이것들은read
,readln
,write
,그리고.writeln
절차들.그러나 디폴트 인수를 프로시저 또는 함수에 대해 허용하는 대체 사양과 프로시저 또는 함수가 다른 파라미터를 가질 수 있는 다형성이 있습니다.
그read[ln]
그리고.write[ln]
순서는 모두 같은 형식입니다.
read [ ln ][ ( [ file , ] variable [ , variable ... ] ) ; write [ ln ][ ( [ file ][ , value [ , value ... ] ] ;
어디에
file
옵션 파일 변수입니다.이 변수를 생략하면 디폴트로input
위해서read
그리고.readln
또는 디폴트로output
위해서write
그리고.writeln
;variable
는 char(문자), integer(정수), real(또는 일부 컴파일러의 경우 특정 레코드 유형 또는 문자열 등의 배열 유형) 등의 스칼라입니다.value
변수 또는 상수입니다.
예:
변화하다 f: 본문; 챠: 차; n,a,I,B: 정수; S: 스트링; 시작한다. 기입하다('결과를 쓸 파일 이름 입력: '); 판독(s); 할당하다(f,S); 고쳐 쓰다(f); 기입하다('이름이 뭐야?'); 판독(입력,S); 기입하다('안녕하세요',S,'! 수행할 계산의 수를 입력하십시오.'); 기입하다(산출량); 기입하다('? '); 판독(N); 기입하다('각각',n,수식을 입력합니다.); 쓰다('하나 이상의 공백으로 구분된 두 정수'); 기입하다; 위해서 i := 1 로. N 하다 시작한다. 기입하다('쌍 번호 입력',i,'? '); 읽어주세요(a,b); 판독; 기입하다(나가.,'A [ ] 。,a,'] + B [',B,'] =',A+B); 끝.; 가까운.(나가.); 끝..
위의 예에서는 컴파일러에 관한 한 9행과 13행은 동일하다.input
에 의해 읽혀지는 파일 변수입니다.read
또는readln
statement, 파일 변수를 생략할 수 있습니다.또한 컴파일러는 15행과 20행은 동일하다고 간주합니다. 왜냐하면 파일 변수가 다음과 같은 경우output
생략할 수 있습니다.즉, (20행에서는) 인수가 절차로 전달되지 않기 때문에 인수를 나열하는 괄호는 생략할 수 있습니다.줄 26은writeln
statement에는 임의의 수의 인수를 사용할 수 있으며 따옴표로 묶인 문자열, 변수 또는 수식 결과일 수도 있습니다.
오브젝트 파스칼은 다형 프로시저와 함수를 지원합니다.다형 프로시저 또는 함수는 같은 이름을 가질 수 있지만 제공된 인수에 의해 구별됩니다.
또한 Pascal은 기본 인수를 지원합니다. 기본 인수를 지정하지 않으면 인수 값이 기본값으로 지정됩니다.
첫 번째 예인 다형성의 경우 다음 사항을 고려합니다.
기능. 더하다(a1,a2:정수):정수; 시작한다. 더하다 := a1+a2 끝.; 기능. 더하다(r1,r2:진짜):진짜; 시작한다. 더하다 := a1+a2 끝.; 기능. 더하다(a1:정수;r2:진짜):진짜; 시작한다. 더하다 := 진짜(a1)+a2 끝.; 기능. 더하다(r1:진짜,a2:정수):진짜; 시작한다. 더하다 := a1+진짜(a2) 끝.;
위의 예에서는 다음과 같습니다.add
2개의 정수값을 사용하여 호출되면 1행에서 선언된 함수가 호출됩니다.인수의 한쪽이 정수이고 한쪽이 실재하는 경우, 어느 쪽이 정수인지에 따라 3행 또는4행의 함수가 호출됩니다.둘 다 실재하는 경우 회선2 의 함수가 호출됩니다.
기본 파라미터의 경우 다음 사항을 고려하십시오.
컨스턴트 세개 = 3; 변화하다 K: 정수; 기능. 더하다(i1: 정수 = 0; i2: 정수 = 0; i3: 정수 = 0; i4: 정수 = 0; i5: 정수 = 0; i6: 정수 = 0; i7: 정수 = 0; i8: 정수 = 0): 정수; 시작한다. 더하다 := i1+i2+i3+I4+I5+i6+I7+I8; 끝.; 시작한다. K := 더하다; { K는 0}입니다. K := 더하다(K,1); { K는 1} K := 더하다(1,2); { K는 3입니다. K := 더하다(1,2,세개); { K는 6 등} 끝..
6행(및 아래 행)에서는 파라미터가= 0
는 컴파일러에게 "인수가 제공되지 않으면 인수를 0으로 가정하십시오."라고 말합니다.19행에서는 인수가 지정되어 있지 않기 때문에 함수가 반환됩니다.0
20행에서는 숫자 또는 변수를 임의의 인수에 지정할 수 있으며 22행에서는 상수를 지정할 수 있습니다.
PHP의 경우
PHP는 인수를 입력하지 않는 한 변수 유형에 신경 쓰지 않습니다.
기능. 합(...$nums): 인트 { 돌아가다 어레이_sum($nums); } 메아리치다 합(1, 2, 3); // 6
variadic 인수를 입력합니다.
기능. 합(인트 ...$nums): 인트 { 돌아가다 어레이_sum($nums); } 메아리치다 합(1, 'a', 3); // TypeError: sum()에 전달된 인수 2는 유형 int이어야 합니다(PHP 7.3 이후).
Python의 경우
Python은 변수 유형에 신경 쓰지 않습니다.
방어하다 후우(a, b, *args): 인쇄물(args) # args는 태플(불변의 시퀀스)입니다. 후우(1, 2) # () 후우(1, 2, 3) # (3,) 후우(1, 2, 3, "안녕하세요") # (3, "안녕하세요")
키워드 인수는 사전에 저장할 수 있습니다.def bar(*args, **kwargs)
.
인라쿠
Raku에서는 바리안트 함수를 생성하는 파라미터의 유형을 slurpy 배열 파라미터라고 하며 다음 3개의 그룹으로 분류됩니다.
납작한 슬러피
이들 파라미터는 1개의 아스타리스크( )로 선언됩니다.*
그리고 반복할 수 있는 하나 이상의 요소 레이어(반복 가능)를 용해하여 인수를 평탄화합니다.
sub fooa, $b, *@foos) {say@args.perl; } foo(1, 2) # [3] foo(1, 2, 3) # [3] foo(1, 2, 3, "hello" # [3] foo(1, 2, 3, 5] [6];
평탄하지 않은 슬러피
이들 파라미터는 2개의 아스타리스크()로 선언되며 목록 내에서 반복 가능한 인수를 평평하게 하지 않고 인수를 그대로 유지합니다.
sub bara, $b, **@bars) {say@args.perl; } bar(1, 2); # [3] bar(1, 2, 3); # [3] bar(1, 2, 3, "hello"; #3 "hello" bar(1, 2, 3, [5], 6]; [6]; [3, [4,5]
문맥상 슬러피
이들 파라미터는 플러스(+)로 선언됩니다.+
)에 부호를 붙이면 "single argument rule"이 적용됩니다.이 규칙은 문맥에 따라 slorpy 인수를 처리하는 방법을 결정합니다.간단히 말해 하나의 인수만 전달되고 해당 인수가 반복 가능한 경우 해당 인수는 slurpy 파라미터 배열을 채우기 위해 사용됩니다.다른 경우라면+@
와 같이 동작합니다.**@
(즉, 평평하지 않은 슬러피).
sub zazgava, $b, +@gavs) {say@args.perl; } zaz(1, 2); # [3] zaz(1, 2, 3, "hello"); #3 "zaz(1, 2, 3, "hello"); [4, 5]; [4, 5] 단일 argment(2, zaz)를 채웁니다.
인루비
Ruby는 variadic 인수 유형에 대해 신경 쓰지 않습니다.
방어하다 후우(*args) 인쇄물 args 끝. 후우(1) # 는 「[1]=> 0」을 인쇄합니다. 후우(1, 2) # 는, 「[1, 2]=> 0」을 인쇄합니다.
녹슬어 있음
Rust는 함수의 가변 인수를 지원하지 않습니다.대신 [7]매크로를 사용합니다.
macro_exp! calculate {// 단일 'eval'(eval $e:expr) => {{ let val:usize = $e; // 타입을 강제로 정수 println!("{} = {}), 문자열화!{$e}, val); }}}; // 여러 '평가'를 재귀적으로 분해합니다(eval $e:expr, $(eval $:expr), +). => {{계산! { eval $e } 계산! { $ ( eval $es ) + } } } ; } fn main() { calculate! { // look ma! 변수 계산!'! eval 1 + 2, eval 3 + 4, eval (2 * 3) + 1 } }
녹은 C의 가변 시스템과 상호 작용할 수 있습니다.c_variadic
피처 스위치다른 C 인터페이스와 마찬가지로 시스템은unsafe
녹슬다.[8]
인스칼라
물건 프로그램. { // Variadic 메서드는 받은 추가 인수를 배열에 저장합니다. // 결과적으로 'printArgs'는 실제로는 하나의 파라미터가 있는 메서드입니다. // String의 가변 길이 배열. 사적인 방어하다 프린트 아그(줄들: 스트링*): 구성 단위 = { 줄들.앞지르다(인쇄) } 방어하다 주된(args: 어레이[스트링]): 구성 단위 = { 프린트 아그("안녕하세요"); // printArgs(["hello"])의 줄임말 프린트 아그("안녕하세요", "세계"); // printArgs(["hello", "world")의 줄임말 } }
인스위프트
스위프트는 변종논쟁의 종류에 신경을 쓰지만, 모든 것을 이해한다.Any
타입을 사용할 수 있습니다.
기능하다 환영하다(Time Of The Day: 스트링, 이름: 스트링...) { // 여기서 이름은 [String]입니다. 인쇄물("저희 회사에는\(이름.세어보세요)사람") 위해서 이름. 에 이름 { 인쇄물("안녕하세요.\(이름.),좋아요.\(Time Of The Day)") } } 환영하다(Time Of The Day: "아침", 이름: '조셉', 클라라, '윌리엄', "마리아') // 출력: // 4명인 것 같아요. // 안녕하세요 조셉, 좋은 아침입니다. // 안녕 클라라, 좋은 아침 // 안녕 윌리엄, 좋은 아침 // 안녕 마리아, 좋은 아침
인 Tcl
Tcl 프로시저 또는 람다는 마지막 인수가 다음과 같을 때 가변적입니다.args
: 나머지 모든 인수 목록(빈 인수)이 포함됩니다.이 패턴은 다른 절차와 유사한 많은 [9][10]방법에서 일반적입니다.
proc가 {timeOf}을(를) 맞이하다The Day args {는 이름 $args 앞에 "[lllength $args] people"을 붙인다.{는 "Hello $name, good $timeOf"를 붙인다.The Day } } greet "아침" "조셉" "클라라" "윌리엄" "마리아" # 출력: # 4명이 있는 것 같아 # 안녕하세요 조셉, 좋은 아침 클라라, 좋은 아침 # 안녕하세요 윌리엄, 좋은 아침 # 안녕하세요 마리아, 좋은 아침
「 」를 참조해 주세요.
- 자바 프로그래밍 언어의 Varargs
- 가변 매크로(C 프로그래밍 언어)
- 가변 템플릿
레퍼런스
- ^ 헨리 S.레너드와 H.N. 굿맨, 개인의 미적분학.1936년 12월 28~30일 캠브리지 MA에서 열린 기호논리협회 제2차 회의에서 행한 강연의 요약, 기호논리 저널 2(1) 1937, 63.
- ^ Klemens, Ben (2014). 21st Century C: C Tips from the New School. O'Reilly Media, Inc. p. 224. ISBN 978-1491904442.
- ^ CLP(H): 헤지를 위한 제약 논리 프로그래밍
- ^ "<cstdarg> (stdarg.h) - C++ Reference". www.cplusplus.com.
- ^ "DCL50-CPP. Do not define a C-style variadic function".
- ^ "Go by Example: Variadic Functions".
- ^ "Variadics". Rust By Example.
- ^ "2137-variadic". The Rust RFC Book.
- ^ "proc manual page". Tcl/Tk Documentation.
- ^ "args". Tcler's Wiki.
외부 링크
- 가변 함수로제타 코드 태스크는 50개 이상의 프로그래밍 언어로 가변 함수를 구현한 것을 보여줍니다.
- Variable Argument Functions : C++의 Variable Argument Functions에 관한 튜토리얼
- GNU libc 매뉴얼