我有一個頭文件A.h
,其中我定義了一個const int ID = 4;
。我已將此頭文件包含在C文件A.c
和main.c
中。我使用了標頭警衛#ifndef A_H #define A_H
等。但是,當我嘗試編譯代碼時,出現錯誤multiple definition of ID
。 我在某處讀到,在大多數情況下,通過使用#pragma once
可以避免這種情況,但我仍然收到錯誤消息。 我的問題是如何在C中定義變量?我是否需要將ID的定義移動到C文件,但是我必須在每個使用的文件中聲明它?或者在這種情況下使用extern
的唯一方法?const int的多重定義
0
A
回答
1
是的,使用extern
是唯一的解決方案。或者包含警衛在同一個翻譯單元中防止多重包含,這是一個多重定義錯誤。
2
在C中,只允許每個對象具有單個定義。如果您有多個.o
文件(編譯單元),則包含警衛人員和類似人員無助於此。他們每個人都有一個副本,這是不允許的。
如果不需要該對象的地址,你只在其常量值感興趣可以通過
enum { ID = 4 };
更換這定義int
類型的命名值ID
,你可以輕鬆地把在頭文件中。
0
當定義一個積分變量爲const,編譯器可以並經常將在值插頭當變量被使用,並且永遠不會爲它
當你的地址發生異常分配存儲標識符。在這種情況下,存儲大部分被分配,並且如果聲明位於頭文件中,將會發生多個定義。 在這種情況下,您別無選擇,只能使用extern
。
相關問題
- 1. `Counter :: metaObject()const'的多重定義
- 2. 多重定義
- 3. 多重定義
- 4. 重新定義int main()C++
- 5. 多重定義
- 6. 爲什麼const int比const int&更快?
- 7. 關於「int const * p」和「const int * p」
- 8. 「Int」和「const int的」在C++
- 9. 多重定義?
- 10. 「的......多重定義」錯誤
- 11. 分配const int的*
- 12. 靜態const int的
- 13. 轉換** const int的**
- 14. 如何正確定義.h文件中的const int?
- 15. const extern C-array鏈接器多重定義
- 16. const int *&vs typedef int * IntPtr
- 17. int * const a = int const * b,對於obj(obj * const a = obj const * b)是否爲true?
- 18. 返回const int的*和回訪const int的*參考
- 19. C++多重定義錯誤
- 20. 多重定義
- 21. 一個int錯誤的重定義
- 22. const int&x = 4和const int x = 4之間的區別
- 23. const int&value = 12和const int value = 12之間的區別;
- 24. const char * to int cast?
- 25. 轉換爲const int
- 26. 從const int轉換爲C++中的int
- 27. 從int **到const int的轉換無效**
- 28. 從int到const的轉換int
- 29. 從 'const int的*' 到 'INT' 無效轉換
- 30. 「int * const const * b」是什麼意思?
http://stackoverflow.com/questions/1433204/what-are-extern-variables-in-c – cnicutar