[英]There are multiple definitions of a variable but the linker does not generate errors on my machine
在我當前的項目中,我正在初始化一個 window 來繪制。 我正在使用 function 指針來處理來自多個平台的初始化。 所以我真的只想要一個 window_init function 指針的實例。
我注意到我忘記在我的 header 文件中將此 function 指針標記為外部,並在我的 C 文件中再次定義它以提供存儲。
header 包含在多個文件中,因此據我了解,應該生成 linker 錯誤。 我在筆記本電腦上對此進行了測試,實際上它確實產生了 linker 錯誤。 為什么我的桌面沒有產生錯誤/我怎樣才能找到? 在這兩種情況下,我在 Clion 中使用 mingw64 和 cmake 進行構建,使用-Wall -Wextra -pedantic -Werror
。
所以為了清楚起見:我的桌面構建良好,我的筆記本電腦給了我 linker 錯誤。 我預計兩台機器都會出現 linker 錯誤,我想找出為什么不會發生這種情況。
解決方案當然是使用 extern 然后在兩台機器上構建,但是我想知道發生了什么。
這是一個最小的示例,它在我的桌面上也可以正常構建,而我預計它會失敗:
window.h
#ifndef CEXTERNTETS_WINDOW_H
#define CEXTERNTETS_WINDOW_H
void window_functions_init();
void(*window_init)(); //This is the first definition and should be marked as extern to my understanding if I want to give it storage in my c file
#endif //CEXTERNTETS_WINDOW_H
window.c
#include "window.h"
#include <stdio.h>
void(*window_init)(); //This is the second definition
void window_init_implementation()
{
printf("window_init_implementation\n");
}
void window_functions_init()
{
window_init = &window_functions_init;
}
第二個包含(我需要在多個文件中包含 window.h 所以我在這里添加它並添加了一個 function 以便編譯器無法優化它)
#ifndef CEXTERNTETS_SECOND_INCLUDE_H
#define CEXTERNTETS_SECOND_INCLUDE_H
#include "window.h"
void doit()
{
printf("doit");
}
#endif //CEXTERNTETS_SECOND_INCLUDE_H
main.c
#include <stdio.h>
#include "window.h"
#include "second_include.h"
int main() {
window_functions_init();
window_init();
doit();
printf("Hello, World!\n");
return 0;
}
編輯:
能夠找到關於 -fno-common 的信息。
這是 Unix 世界中流行的常見編譯器擴展。 要禁用擴展,請使用-fno-common
。
-fno-common
在版本 10 之前的 GCC 中默認不啟用任何警告或標准選項。 這在技術上並不構成違反標准,因為標准將此列為未定義行為。 未定義的行為通常不需要診斷消息。 允許實現定義標准未定義的行為。
然而,這是不可取的,並且 GCC 10 最終默認為-fno-common
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.