2013-06-13 4 views
3
특정 하드웨어 주소 유형은 나는 그것이 volatile unsigned long 또는 unsigned long volatile 수 있습니다 알고

부호 휘발성 긴 대 휘발성 부호없는 긴

unsigned volatile long * 

에 주조 된 오늘 코드를 가로 질러 온

; volatile을 정의하는 또 다른 방법입니까, 아니면 코드의 버그입니까?

경고가 활성화되어 경고가 표시되지 않습니다. 나는 GCC-4.7.0을 사용하고 있었다.

답변

2

그것은 또 다른 방법이다. 의미 상의 차이는 없다.

0

은 C 언어 타입 지시자 (int, unsigned, char, signed, void 등), 형 한정자를 임의의 순서로 기록 (static, extern 등)이 서로 결합 될 (volatile, const 등) 스토리지 클래스 지정자를 허용한다. 그들은 모두 소위 "선언 지정자"이며 순서는 중요하지 않습니다. "The placement of a storage-class specifier other than at the beginning of the declaration specifiers in a declaration is an obsolescent feature."

그래서 당신은 항상 선언의 시작 부분에 저장소 클래스 지정자를 작성해야합니다 : 미래에 명시된 된 C 표준 (C11 6.11)에 대한 향후 방향에 그러나

. 이러한 작업을 수행하지 않는 코드는 향후 버전의 C 표준에서 컴파일되지 않을 수도 있습니다.

나는이 때문에 항상 [storage-class specifiers] [type qualifiers] [type specifiers] 순서로 지정자를 작성하고 3 가지 유형을 혼합하지 않는 것이 좋은 프로그래밍 스타일이라고 말합니다.

volatile unsigned long * 

아니면 불필요하게 장황 할 경우 :

귀하의 선언을 작성하는 가장 적절한 방법은 다음이다는 것을 의미하기 때문에, 가지 재미

auto volatile unsigned long * 
+1

표준 지금 장려 'int 휘발성 ** x','int * 휘발성 * x','int ** 휘발성 x' 패턴의 불규칙성. – sh1

+1

@ sh1 그건 정말 관련이 없어요. 그것들은 "포인터 선언자"입니다. 당신의 3 가지 예는 다른 의미를 가지고 있습니다. 일반적으로 C 표준의 전체 부분은 읽기가 쉽지 않습니다 ... – Lundin

+0

기다림 - 그렇지 않습니다. 그들은 단지'정적'또는'자동'이 먼저 가야한다고 말하고 있으며,'휘발성 '은 그렇지 않아야한다. – sh1