2009-06-08 3 views
12

저는 최근에 다음과 같이 보이는 몇 가지 코드를 보았습니다.두 개의 인수로 sizeof 연산자를 호출하는 이유는 무엇입니까?

if(sizeof(var,2) == 4) { ... } 

(var는 형식 임)

sizeof 연산자에 대한 두 개의 인수가있는 것을 보니 매우 놀랐습니다. ISO/ANSI C99 표준의 빠른 스캔은 어떤 비밀도 산출하지 못했습니다. 쉼표를 허용하는 문법을 읽지 못했습니다.

Google 코드를 검색하면 일부 PPC 코드에서이 구문의 an example를 찾을 수있었습니다.

이것은 PPC 특정 구문입니까? 무슨 뜻이에요?

WindRiver Diab compiler

편집 : 그것은 내가 뭘보고 있었는지 -뿐만 아니라 링크 된 코드 - 특정 구문을 WindRiver Diab compiler :

sizeof (형식, const) :

int-const가 0 인 경우 sizeof 형식의 바이트 단위 크기를 반환합니다.

int-const가 1 인 경우 sizeof는 유형의 정렬을 반환합니다.

int-const가 2 인 경우 sizeof는 유형을 지정하는 정수를 반환합니다. 값은 Diab C/C++ 사용자 안내서에서 "sizeof operator"를 찾으십시오.

와우, 그들은 sizeof 연산자의 의미를 실제로 오버로드했습니다.

EDIT2 : 전체 설명서는 다음 위치에 있습니다. http://www.vxdev.com/docs/vx55man/diab5.0ppc/c-additi.htm#3001432

+0

"var"는 유형이라는 것을 언급하는 것이 중요합니다. 왜냐하면 쉼표 연산자를 배제 할 것이기 때문입니다. 그러나 귀하의 질문에 "var"변수처럼 보입니다. –

+0

명확성을 위해 이름이 변경된 변수. 감사. –

+2

편집 : 와우, 그게 ... C 언어의 불필요한 복잡성. C는 충분히 복잡합니다 ... 정렬을 말할 수 있기를 원한다면, 당신이 주장한다면, 함수의 정렬 또는 연산자를 작성하십시오. 쳇. (너의 잘못이 아니라 데이비드, 나쁜 언어 구현 자에 대해 방금 ...) –

답변

9

추가 연구에서이 현상은 WindRiver Diab compiler과 관련된 것으로 나타났습니다. 자세한 내용은 EDIT을 참조하십시오.

+0

+1로 바 꾸었습니다. –

3

그것은, 첫 번째 인자를 평가 한 결과를 멀리 던지는 comma operator의 간단한 응용 프로그램처럼 나에게 보이는, 그 다음 두 번째 인자를 평가합니다.

이 경우 리터럴 2의 크기가 4인지 여부를 판단합니다. "var"부분은 관련이 없습니다.

+0

처음에는 똑같은 줄 알았지 만 요점은 무엇입니까? 그리고 그것이 사실이라면, 링크 된 코드는 절대로 작동하지 않을 것입니다, 그렇죠? 두 번째 인수는 int 리터럴이므로 크기는 항상 해당 아키텍처의 정수 크기가됩니다. –

+0

쉼표 연산자를 사용 했습니까? 다른 괄호 집합에 쌍을 넣을 필요가 없습니까? – veefu

+0

포인트? 왜 그 점이 있다고 생각하니? –

1

붉은 청어처럼 보입니다. 내 생각 엔 실수로 쉼표 연산자를 사용하고 있으며 sizeof가 마지막 값에 적용되고있는 것 같습니다.

+0

그럼 왜 링크 된 코드가 그대로 쓰여 있습니까? 음 ... –

+1

이름이 잘못 되었습니까? 무엇이 잘못된 이름입니까? –

+1

@Rob, 나는 영어의 마스터가 아니기 때문에 :). 직접 답을 찾기 위해 빨간색 청어 – JaredPar

0

앞서 언급했듯이 쉼표 연산자가 적용되고 sizeof는 정수 리터럴의 크기를 반환합니다. Offhand는 저자의 부분에서 오류처럼 보이지만, 불길한 코딩이 일어날 수 있습니다.

sizeof 표현식은 평가되지 않으므로 많은 까다로운 작업에 사용할 수 있습니다. 한 가지 예는 컴파일러에서 코드를 생성하지 않고 참조되지 않은 변수에 대한 참조를 제공하는 것입니다. 예제를 위해보다 나은 어설 션 매크로를 만들려면 this article을 참조하십시오. Alexandrescu는 메모리가 작동하는 경우 Modern C++ Design에서 sizeof trickery의 다른 예제를 가지고 있습니다. 이러한 명백하지 않은 용도 중 하나가 의도 된 것은 가능하지만 가능성은 없습니다.

사용법에 관계없이이 상황에 주석이 달린 것이 아니라면 분명히 가독성이 절충 될 가치가 없으므로 변경해야합니다.

0

중요한 면책 조항 : 아래의 코드는 의사 코드입니다. 의 sizeof 인수는 실제로 "실행 됨"이라는 의미의으로 평가되지 않으며 항상 컴파일 타임 구조이므로 enum과 같은 템플릿 작성자가 선호하는 도구 중 하나입니다.

아래에서 C++ (0x)에서 auto을 빌 렸습니다. 어떤

auto s = sizeof int; 

즉, : 그것은 조금 무엇 많은 사람들이 모르는 것은이 같은 유효 sizeof를 호출 할 수

입니다 간단한 예제를 초기화 표현에서 유형을 추론하도록 컴파일러에 지시하고 있습니다 괄호가 필요했습니다. 만약 sizeof로 (X, Y)를 통과 할 경우, 따라서 그것은

auto c = (x,y); 
auto s = sizeof c; 

또는 동등 단지

auto c = x,y; 
auto s = sizeof c; 

x,y

각 부분이 좌우로 평가되는 순서, 및 순서는 마지막 부분의 값을 얻습니다.이 경우는 y입니다. 그래서, 원래의 코드는

auto s = sizeof y; 

거의 비슷하다 그래서 나에게 보이는 문제의 컴파일러는하지만 완전히와, 또한 다른 컴파일러에 컴파일 연장을 소개 점에서 정말, 정말 뇌사 무언가를한다는 것을 이의. 이것은 나쁘다.

+0

다행히도 gcc와 MSVC는 이것을 허용하지 않습니다. 'sizeof (int, 2)'와 같은 코드는 두 컴파일러 모두에서 "before : ','token : '과 유사한 오류를 발생시킵니다. –

+0

나는 내 anser가 불완전하다는 것을 알고 있습니다. "int"자체는 평가할 수있는 표현이 아닙니다. 'sizeof (5,5)'를 쓰면 컴파일됩니다. –

관련 문제