簡體   English   中英

我們可以在函數內修改函數原型嗎?

[英]Can we modify function prototype inside function?

我在C中聲明如下:

void abcd(int , char);

void main()
{
    extern void abcd(char);
    abcd (q);
}

是否可以實現這樣的代碼? C將如何允許我們這樣編碼? 函數調用abcd()會將'q'作為char還是整數?

C11 6.2.7p2

引用同一對象或函數的所有聲明都應具有兼容類型 ; 否則, 行為未定義

void abcd(int, char); 是一個外部聲明,表示abcdintchar作為參數。 它與extern void abcd(char);不兼容extern void abcd(char); ,它說同一個函數現在只需要一個char作為參數。

如果我正確讀取標准,這不是約束錯誤,因此編譯器甚至不需要為此生成警告 它仍然是破碎和錯誤的。

對不起,我忽略了C而不是C ++標簽(刪除了C ++的東西)。 我認為這應該在C中做:

void abcd_c(char x){};
void abcd_i(int x){};
int main(int argc, char *argv[])
 {
 #define abcd abcd_c
 abcd('t');
 abcd('e');
 abcd('s');
 abcd('t');
 #undef abcd

 #define abcd abcd_i
 abcd(123);
 #undef abcd
 }

您只需使用#define/#undef在部分代碼中選擇想要的行為

我相信在C中你不能這樣做。 實際上編譯器甚至都不會“哭”,因為這在語法上是正確的。 但另一方面,這是錯誤的,不會執行。 就個人而言,我非常關注編譯器接受的錯誤但會破壞執行。 一般來說,在這種情況下,您必須使用正確的參數,字符在main之上聲明此函數。 因為C會查找這個特定函數的聲明,但她找不到它。 在C ++中,它很容易,因為你可以重載函數,編譯器只能從參數類型中理解。

暫無
暫無

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

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