g ++에서 다음 코드 부분에 대해 잘못된 포인터 전환에 대해 경고하도록 어떻게 지시 할 수 있습니까?g ++에서 잘못된 함수 포인터 변환에 대해 경고하도록 gcc에 지시하는 방법은 무엇입니까?
그리고 왜 gcc가 그것에 대해 경고하지 않습니까? do_something()에 대한 포인터를 전달할 때 무엇이 발생할 수 있습니까?
#include <stdio.h>
typedef void (*void_func_t)();
typedef void (*void_int_func_t) (int, int, int);
void do_something(void_func_t f)
{
void_int_func_t foo = f;
foo(1,2,3);
}
void a()
{
printf("a\n");
}
void b(int one, int two, int three)
{
printf("%i, %i, %i\n", one, two, three);
}
int main()
{
do_something(a);
do_something(b);
return 0;
}
출력 :
➜ gcc -W -Wall -Werror func.c
➜ ./a.out
a
1, 2, 3
C++, 그러나 경고 것/제공 오류
g++ -W -Wall -Werror func.c
func.c: In function ‘void do_something(void_func_t)’:
func.c:8:27: error: invalid conversion from ‘void_func_t {aka void (*)()}’ to ‘void_int_func_t {aka void (*)(int, int, int)}’ [-fpermissive]
func.c: In function ‘int main()’:
func.c:25:19: error: invalid conversion from ‘void (*)(int, int, int)’ to ‘void_func_t {aka void (*)()}’ [-fpermissive]
func.c:6:6: error: initializing argument 1 of ‘void do_something(void_func_t)’ [-fpermissive]
'-Weverything'을 사용할 수있는 곳에서'gcc' 대신'clang'을 사용할 수 있습니까? –
C 및 C++은 다른 언어입니다. obsoletcence를 사용하면서도 유효한 C 기능을 사용한다면 호환 컴파일러가 왜 경고해야합니까? – Olaf
아니요, @ FiddlingBits 내 경우에는 불가능합니다. @Olaf, C에서'void foo()'또는'void foo (void)'와 같은 함수를 삭제하는 것과는 상당한 차이가 있음이 분명하지 않았습니다. 그래서 궁금 해서요. 왜 나는이 질문을했다. – yussuf