簡體   English   中英

如何指示gcc像g ++一樣警告我有關無效函數指針轉換的信息?

[英]How to instruct gcc to warn me about invalid function pointer conversion just as g++ would do?

我該如何指示gcc對以下無效代碼進行警告,例如g ++將對以下代碼段進行無效的函數指針轉換?

和..為什么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]

函數原型與空括號是過時的1種功能。 不要使用它。

如果使用正確的聲明,則會收到警告:

typedef void(*void_func_t)(void);

由於這個舊功能,類型void(*)()void(*)(int, int, int)是兼容的。 前一種類型帶有未指定數量的參數。 這是雙重問題,因為編譯器不會發出警告,並且如果您使用不正確的參數數量調用該函數,則該行為是不確定的。

與C語言不同,在C ++中,空括號表示函數不接受任何參數,因此void(*)()等同於void(*)(void)


1 (引自:ISO / IEC 9899:201x 6.11.6函數聲明符1)
使用帶有空括號的函數聲明符(不是原型格式的參數類型聲明符)是過時的功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM