2016-08-09 1 views
4

fprintf을 호출하는 프로그램이 있습니다. Visual Studio 2013에서는 오류 및 경고없이 모든 것이 컴파일되고 실행됩니다. 이제 프로젝트 (변경 없음) 비주얼 스튜디오 2015로 마이그레이션 된 나는 내 fprintf 전화의 대부분에 다음과 같은 경고를 받고 오전 :Visual Studio 2013에서 Visual Studio 2015로 마이그레이션 한 후 printf 스타일 함수를 호출하면 경고가 발생합니다.

이러한 경고의 대부분은 다음의 코드를 가리키는
C4474: too many arguments passed for format string 

:

fprintf (stderr,"Missing header file name. Formant is :\n", pArg); 

이 문제를 어떻게 해결할 수 있습니까? 코드를 다시 작성해야합니까, 아니면 이러한 경고를 발생시키는 프로젝트 설정에 문제가 있습니까? 인라인 STDIO.H로 이동 된의 printf와 scanf와 모든 기능의

정의, conio :


나는 this MSDN 문서에서 이러한 기능에 대한 변경이 있었다 것을 알 수있다. h 및 기타 CRT 헤더가 있습니다.

내 문제와 관련이 있습니까? 이것은 VS 2015의 무해한 변화입니까, 아니면 여기서도 잠재적으로 충돌을 유발할 수있는 함정입니까?

+8

참조 [2015 Visual C++에서 주요 변경] (https://msdn.microsoft.com/en-us/library/bb531344.aspx), 구체적으로는 ' " –

+1

일부 코드를하시기 바랍니다, 그래서 우리가 올바른 방향으로 인도 할 수 있습니다. – Ajay

+0

이것을 유발하는'printf()'-call의 예가 있습니까? 정의되지 않은 동작을 일으키는 것처럼 들립니다. – EOF

답변

7

Visual C++ 2015는 "format specifiers checking"을 도입했습니다. 컴파일러는 컴파일 타임에 몇 가지 문제점을 감지하고 경고를 생성 할 수 있습니다. 2015 년 이전에는 형식 문자열과 인수가 일치하지 않아 컴파일 타임이나 런타임에 문제가 발생하지 않았습니다 (문제가 심각하게 프로그램을 중단시키지 않는 한).

표시 할 코드에 pArg이라는 추가 인수가 있는데이 형식 문자열에 자리 표시자가 없기 때문에 fprintf()에 의해 사용되지 않습니다.

모든 경고를 통해 해결해야합니다. 무시하지 마십시오. 무해한 문제이거나 심각한 버그 일 수 있습니다. 일부 경고는 /W4으로 만 표시됩니다. 항상 /Wall을 사용해야합니다.

다음은 몇 가지 예입니다 :

void f() 
{ 
    printf("hello, world", 42); // line 8: no %d in format string 
    printf("missing %d");   // line 9: missing argument for %d 
    printf("wrong type %f", 3); // line 10: wrong argument type 
} 

이들은 cl /Wall으로 생성 된 경고입니다 gcc가 동등한 -wformatsince 3.0을했다

a.cpp(8): warning C4474: 'printf' : too many arguments passed for format string 
a.cpp(8): note: placeholders and their parameters expect 0 variadic arguments, 
      but 1 were provided 
a.cpp(9): warning C4473: 'printf' : not enough arguments passed for format string 
a.cpp(9): note: placeholders and their parameters expect 1 variadic arguments, 
      but 0 were provided 
a.cpp(9): note: the missing variadic argument 1 is required by format string '%d' 
a.cpp(10): warning C4477: 'printf' : format string '%f' requires an argument of 
      type 'double', but variadic argument 1 has type 'int' 

하는 것으로.

+1

Visual Studio의'/ Wall'은 gcc와 clang에서'-Wall'과 동일하지 않습니다. 그것은 실제 세계 프로젝트에서 비현실적입니다 (http://stackoverflow.com/questions/4001736/whats-up-with-the-thousands-of-warnings-in-standard-headers-in-msvc-wall).)이며 [Microsoft 자체에서는 권장하지 않습니다.] (https://blogs.msdn.microsoft.com/vcblog/2010/12/14/off-by-default-compiler-warnings-in-visual-c/) – Drop

+0

@Drop 당신은 잘못 읽었습니다. msdn 블로그 링크는 'pragma warning'을 사용하여 시끄러운 경고를 비활성화 한 다음 "코드베이스의/Wall 스위치를 켜십시오"라고 말합니다. 항상 * 모든 프로젝트에서 * 켜고 타사 헤더에서 내 자신의'push_warnings.h' 및'pop_warnings.h '를 사용합니다. 나는 clang, gcc 및 Visual C++에서 구현했습니다. 매력처럼 작동합니다. – isanae

+0

@isanae이 편집과 수정 제안과 거의 동일한 대답입니다. –

관련 문제