亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 6685 | 回復: 15
打印 上一主題 下一主題

[C++] multiple definition of的疑問 [復制鏈接]

論壇徽章:
0
跳轉到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2013-09-23 15:59 |只看該作者 |倒序瀏覽
  1. // ----------------------------------------------------------------------- Test.h
  2. #include <iostream>

  3. class Test
  4. {
  5. public:
  6.     Test();
  7.     ~Test();
  8.    
  9.     // 寫在這里不會報“multiple definition of”
  10.     void test1(void)
  11.     {
  12.         std:: cout << "test1" << endl;
  13.     }
  14.    
  15.     void test2(void);
  16.    
  17.     void test3(void);
  18. };

  19. // 如果寫Test.h的這里就會報“multiple definition of”
  20. void Test::test2(void)
  21. {
  22.    std:: cout << "test2" << endl;
  23. }

  24. // 加了inline關鍵字的函數就不會報“multiple definition of”
  25. inline void Test::test3(void)
  26. {
  27.    std:: cout << "test3" << endl;
  28. }
復制代碼
  1. // ----------------------------------------------------------------------- Main.cpp
  2. #include "Test.h"

  3. int main(void)
  4. {
  5.     Test t;
  6.     t.testMethod();
  7.     return 0;
  8. }
復制代碼


直接在類聲明中定義的test1是不是內聯函數?不管代碼塊多大總是內聯?

為什么test1(), test2()不會被提示multiple definition of,而test3()會被提示?

論壇徽章:
0
2 [報告]
發(fā)表于 2013-09-23 16:53 |只看該作者
1.對于頭文件,為了防止被重復引用,可以使用
#pragma once
或者
#ifndef  XXX (以Test.h為例,那么這個XXX就是TEST_H)
#define XXX

#endif

2.類成員的實現部分不要寫在頭文件中,而是得寫在相應的源文件中,例如Test.cpp

3.內聯函數去解決 “重復定義”的問題,那只是偶然,跟它一點關系都沒有。

論壇徽章:
0
3 [報告]
發(fā)表于 2013-09-23 17:01 |只看該作者
內聯函數解決重復定義是不是在編譯階段函數被內聯掉了,也就沒有那個函數了所以才解決了函數重復定義的問題?
像Test類中的test1那樣寫的話,默認是不是就是內聯的?不管test1的代碼塊有多大都是內聯的么?回復 2# Ox155


   

論壇徽章:
0
4 [報告]
發(fā)表于 2013-09-23 17:03 |只看該作者
對于代碼(函數)不含有循環(huán)語句或者是代碼行數只有幾行的,都默認是內聯 。

論壇徽章:
0
5 [報告]
發(fā)表于 2013-09-23 17:09 |只看該作者
Test的test1函數,不報重復定義是什么原因?
回復 4# Ox155


   

論壇徽章:
0
6 [報告]
發(fā)表于 2013-09-23 17:11 |只看該作者
你有沒發(fā)現,你的test1和其它兩個函數不一樣。
test1的實現在類里面,test2,test3在類外。

論壇徽章:
0
7 [報告]
發(fā)表于 2013-09-23 17:17 |只看該作者
在類里面定義就不算重復定義了? 回復 6# Ox155


   

論壇徽章:
0
8 [報告]
發(fā)表于 2013-09-23 17:21 |只看該作者
哎喲,你自己試試不就知道了!
還有  這是基礎知識

論壇徽章:
0
9 [報告]
發(fā)表于 2013-09-23 17:23 |只看該作者
恩,正在學c++的基礎東西,謝謝了~
回復 8# Ox155


   

論壇徽章:
17
處女座
日期:2013-08-27 09:59:352015亞冠之柏太陽神
日期:2015-07-30 10:16:402015亞冠之薩濟拖拉機
日期:2015-07-29 18:58:182015年亞洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥豬
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56雙子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
10 [報告]
發(fā)表于 2013-09-24 11:45 |只看該作者
回復 9# yuanzhifei89


    C++有一次定義原則(ODR):翻譯單元包含的任何變量,函數,類,枚舉或模板定義不可以多于一次(頭文件被不同的實現文件包含了幾次那么在頭文件中定義任何內容就會有幾次定義出現)。
任何程序只能精確的含有任何非inline函數一次定義。一個在類內定義的函數默認是inline的。在調用inline函數地方直接進行代碼替換不存在使用函數符號的跳轉。
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術有限公司. 版權所有 京ICP備16024965號-6 北京市公安局海淀分局網監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯網協會會員  聯系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉載本站內容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP