const
을 (를) 멀리 캐스팅하는 것이 불법입니까?언제 법적으로 합법적으로 또는 불법으로 캐스팅하고 있습니까? (gcc, clang 및 MSVC)
대부분의 경우 const
은 컴파일러에 의해 시행되는 사용자를위한 단순한 주석입니다. 이 질문은 멀리 던지기 const
가 엄격하게 불법이고 C99 표준의 어떤 부분이 그것을 금지하는지 묻습니다.
글로벌 범위의 const
함수 포인터가 때때로 gcc에 의해 인라인된다는 것을 관찰했기 때문에 어떤 경우에는 불법이라고 생각합니다. 이러한 함수 포인터가 나중에 프로그램에서 합법적으로 수정 될 수있는 경우이 최적화는 유효하지 않습니다. 덧붙여서 나는 멀리 던지기에 대한 설명을 읽었을 것입니다. const
은 StackOverflow에서 불법이지만 그냥 찾을 수 없습니다. (대답은 const
은 변수가 원래 const
으로 선언되지 않은 경우에만 제외 될 수 있다고 생각합니다.)
C99 표준에 명시되어 있기를 바라고 있기 때문에이 C99 태그를 붙였습니다.하지만 대답은 C99의 gcc, clang 및 MSVC 구현에 공통된 동작을 설명 할 수 있습니다. 그러면 나에게도 충분합니다.
(분명히 이것은 매우 기본적인 질문이므로 C 표준 인에 대해 복제본을 찾지 못했습니다. 다른 사람이 정확한 복제본을 가리킬 수 있으면 투표를 닫을 수 있습니다. 이 질문 제목은 SSO가 이런 종류의 질문을하는 데 최소한 도움이된다고 생각합니다.)
"표준이 허용하지 않는시기는 언제입니까?"또는 "이 기능이 작동하지 않는시기"를 묻는 중입니까? 전자에 대한 대답은 "거의 항상"입니다. 후자에 대한 대답은 "거의 절대"입니다. – aaaaaa123456789
@ aaaaaa123456789이 질문에 대해서는 표준 (즉, 'languge-lawyer'태그)에 따라 답변을 원하지만, 언제 작동하는지에 대한 추가 논평은 신경 쓰지 않아도됩니다. (추신 : 나는 또 다른 단락을 당신의 의견 뒤에 덧붙여 편집했다.) 또한, "const"가 버려지는 것이 합법적이라고 생각할 때 "never never"가 올바른 답이라고 생각하지 않는다. (분명히 나는 틀릴 수있다 - 그러므로 질문!) – Praxeolitic
나는 그것이 언제 허용되는지 완전히 확신하지 못한다. 대부분의 경우, 그렇지 않습니다. 반면에 값은 리터럴이 아니며 (일반적으로 리터럴은 소스 코드에 포함되어 있으며 대부분의 OS는 메모리의 프로그램 코드를 수정하지 못하게합니다). – aaaaaa123456789