2012-11-22 3 views
2

나는 오픈 소스 프로그램을 유지하고 있으며 내 사용자 중 한 명은 전에 사용 해본 적이없는 clang으로 컴파일되지 않는다고보고했다. 내가 얻는 오류 중 하나는 입니다. * 경고 : 함수 유형 'junky_t'에 대한 한정자 (일명 'void (const int &, const int &)')의 동작이 명시되지 않았습니다. *.이 const 지정자가 비정상적인 동작을하는 이유는 무엇입니까?

입니다
$clang -DHAVE_CONFIG_H -g -g -O3 -Wall -MD -Wpointer-arith -Wshadow -Wwrite-strings -Wcast-align -Wredundant-decls -Wdisabled-optimization -Wfloat-equal -Wmultichar -Wmissing-noreturn -Woverloaded-virtual -Wsign-promo -funit-at-a-time -Weffc++ -D_FORTIFY_SOURCE=2 -MT demo.o -MD -MP -c -o demo.o demo.cpp 

demo.cpp:5:5: warning: qualifier on function type 'junky_t' (aka 'void (const int &, const int &)') has unspecified behavior 
    const junky_t *junk; 
    ^~~~~~~~~~~~~ 
1 warning generated. 

는, 클래스 demo이있는 함수에 대한 함수 포인터를 가지고 :

typedef void junky_t(const int &foo,const int &bar); 

class demo { 
public:; 
    const junky_t *junk; 
}; 

그리고 여기에 내가 컴파일 할 때 무슨이다 : 나는이 문제를 보여주는 작은 프로그램을 만들었습니다 많은 const 참조가 필요한 서명. demo 클래스의 constjunk이 변경되지 못하도록되어 있습니다. 함수 자체가 const으로 간주 될 수 있기 때문에 분명히 모호합니다. gcc 또는 llvm으로 컴파일하는 데 문제가 없지만 Mac에서는 clang으로 컴파일되지 않습니다. 어떻게해야합니까?

+3

쓰기 쓰기, 당신은'junky_t 필요 * const 정크'. –

+0

http://stackoverflow.com/a/7739009/412080 –

+1

const가 의미하는 바는 무엇이라고 생각하십니까? – PlasmaHH

답변

3

이것은 아니요 지정되지 않은 동작입니다. clang에 대한 경고는 잘못되었습니다. 귀하의 코드는 합법적 인 C++입니다. 표준 (C++ 11)은 함수 유형 위에 cv 한정자가 무시된다는 것을 설명합니다.

따라서 함수 유형 위에 const 한정자를 두는 것은 의미가 없습니다. 당신이 당신의 포인터 const를하고 싶다면 다음 const` (안 pointee)`로 포인터를 원하는 경우

junky_t * const junk;

그렇지 않으면 단지

junky_t * junk;

+0

경고가 적당합니다. "const"는 아무 효과가 없습니다. 그러나 분명히 사람이 "const"라고 쓰면 어떤 것이 const가되어 그 일이 일어나지 않을 것이라고 기대할 것입니다. 컴파일러는 완벽하게 합법적이지만 작성자가 의도 한 것이 아닌 코드에 대해 경고합니다. 당신이 쓴 두 대안은 당신이 원하는 것을 할 가능성이 훨씬 큽니다. 실제로 스레드 스타터는 "클래스 데모의 const는 쓰레기가 변경되는 것을 방지해야합니다." 그것은 그렇게하지 않으므로 좋은 경고입니다. – gnasher729

+0

@ gnasher729 아니요, 경고 (메시지)는 합리적이지 않습니다. 왜냐하면'const'에는 _unspecified behavior_가 있기 때문입니다. 내가 지적했듯이 이것은 잘못된 것이다. 그러나 나는 그러한 한정자의 사용에 대해 경고하는 것은 좋은 일이라고 (그러나 다른 메시지를 가지고) 동의한다. – MWid