簡體   English   中英

變量有多個定義,但 linker 在我的機器上不會產生錯誤

[英]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.

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