2017-01-29 17 views
8

나는 이것이 아직 중복되지 않았다고 상상할 수는 없지만 C++에 대한보다 복잡한 시나리오가 토론을 지배하는 것처럼 보이기 때문에 쉽게 대답을 찾을 수 없습니다 .C에서 임시 (화합물 리터럴) 매개 변수의 주소를 가져 가기

C99에서 함수 호출의 매개 변수 목록에 임시로 생성 된 주소를 가져 오는 것이 합법적입니까? 예를 들어

, init_list 또는 init_desig_init 등 같은은 다음과 같습니다

typedef struct { 
    int x; 
    int y; 
} point_t; 

int manhattan(point_t *p) { 
    return p->x + p->y; 
} 

int init_list() { 
    return manhattan(&(point_t){1, 2}); 
} 

int init_desig_init() { 
    return manhattan(&(point_t){.x = 1}); 
} 

빅 3 1seem to compile it OK하지만 실제로 임시의 수명이에 확장 될 것이라고 설명 참조를 찾을 수 없습니다 최소한 함수 호출을 통해.

0MM 아래로 답변에 따라, 나오는 것에 따라


내 검색 문제의 부분은 내가, 한 임시에 대한 정보를 찾고 있었다 때문에 잠시이 특정에 대한 올바른 C 용어 초기화 구문은 복합 문자 리터럴입니다.

MSVC를 기준으로 "큰 크로스 플랫폼 3"이라고해야하지만 사실은 "C 컴파일러는 godbolt를 지원합니다"라는 의미입니다.

+1

당신이있어 대답은 훌륭하지만 염두에두고 가치가 거의 잡았다가있다 보다 광범위하게 복합 리터럴을 사용하기 시작할 때 : http://stackoverflow.com/questions/34880638/compound-litetime-lifetime-and-if-blocks – Art

+0

@Art - 아주 좋은 지적입니다. C++의 임시 리터럴 대 C++의 임시 리터럴에 대한 다른 평생 규칙을 기억하려고 애 쓰지 않은 경우 ... – BeeOnRope

답변

7

(point_t){1, 2}은 "일시적인"것이 아닙니다. 복합 리터럴입니다. (C++의 동일한 토큰 시퀀스는 다른 의미를 가지며,이 두 언어는 서로 혼동되어서는 안됩니다.)

화합물 리터럴은 lvalue이므로 유니 타리 & 연산자를 사용하는 것이 타당합니다. 저장 기간은 C11 6.5.2.5/5 적용된다 : 화합물 리터럴 함수 본체 밖에서 발생

경우 개체 정적 저장 기간을 갖고; 그렇지 않은 경우에는 둘러싸는 블록과 연관된 자동 저장 기간이 있습니다.

그래서이 코드가 정확한지, 그리고 화합물은 문자가 선언 된 함수의이 끝날 때까지 기존 유지합니다.

+0

감사합니다. 내 "임시"사용은 부분적으로 왜 이런 세부 사항을 검색하는 데 어려움을 겪었는지 설명합니다. 추가 참조를 위해, 다음은 [gcc doc on _compound literals_] (https://gcc.gnu.org/onlinedocs/gcc/Compound-Literals.html)입니다. – BeeOnRope