[問題] 自訂標頭檔

看板C_and_CPP作者 (幻想的夢境)時間9年前 (2014/10/26 03:50), 9年前編輯推噓4(405)
留言9則, 3人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) VC2010 問題(Question): 我使用自訂標頭檔給兩個不同的C file用,但是編譯器一直顯示已經被參考 我該如何修改? 程式碼(Code):(請善用置底文網頁, 記得排版) //這是標頭檔 sh.h #ifndef _S_H #define _S_H double A(double); char *B(); #endif //enf of header file //這是source file #include<stdlib.h> #include<stdio.h> #include "sh.h" double A(double x){ if(x>0) return 0; else return -1; } char *B(){ char str[50]; sprintf(str,"Hello world!\n"); return str; } //end of source file //這是主程式 #include<stdlib.h> #include<stdio.h> void p1(); void p2(); int main(){ p1(); p2(); system("pause"); return 0; } //end of main program //這是p1.cpp #include<stdio.h> #include "sh.h" void p1(){ A(5.5); B(); } //end of p1.cpp //這是p2.cpp #include<stdio.h> #include "sh.h" void p2(){ A(4.5); } //end of p2.cpp 程式在編譯時,會顯示已經被參考了 我該怎麼改才對? 先謝謝了 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.233.78.140 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1414266642.A.3C6.html

10/26 17:55, , 1F
完整錯誤訊息貼上來看看
10/26 17:55, 1F

10/26 17:56, , 2F
另外你的 B() 違反了置底十三誡之五
10/26 17:56, 2F
因為我原本的程式比較長,所以這邊貼上來的程式碼沒有跟原本一樣,但是大同小異 以下是原本的錯誤訊息 coef.obj : error LNK2019: 無法解析的外部符號 "double __cdecl round(double)" (?round@@YANN@Z) 在函式 "void __cdecl coef(void)" (?coef@@YAXXZ) 中被參考 還有,如果我要做到B()裡面的功能 那我要怎麼改才不違反13誡之5? 煩請指導,謝謝 ※ 編輯: jacky1989 (118.233.78.140), 10/26/2014 19:54:08

10/26 21:35, , 3F
十三誡之五的問題去置底看一看吧, 那裡有提正確的做法
10/26 21:35, 3F

10/26 21:36, , 4F
然後這個錯誤訊息是指"連結器找不到 round, 它是在 coef 裡
10/26 21:36, 4F

10/26 21:36, , 5F
用到的" 你應該是忘了加入 round 所在的檔案一起連結了
10/26 21:36, 5F

10/27 05:25, , 6F
void B(char str[50]);
10/27 05:25, 6F
我有加入這個檔案,好像是在coef已經被include了,所以在其他函式就不能include了 不知道要怎麼改..... 還有,那如果我在B裡面這樣打 char *B(){ char *str; str = (char *)malloc(sizeof(*str)*50+1); sprintf(str,"Hello world."); return str; } 這樣是否也違反13誡之5呢??這樣是不是違反13誡之6阿= = ※ 編輯: jacky1989 (140.136.146.114), 10/27/2014 15:35:40

10/27 15:37, , 7F
這樣不算違反 但是實務上是災難
10/27 15:37, 7F

10/27 15:37, , 8F
除非你有什麼很好的方式去指示使用者去delete那個char*
10/27 15:37, 8F

10/27 15:38, , 9F
喔應該說"free"那個char*. new/delete最好在同scope
10/27 15:38, 9F
所以我原本是要這樣的功能 printf("%s",B()); 應該改成這樣 void *B(char *str){ sprintf(str,"Hello world"); } ---------------------- char str_tmp[50]; B(str_tmp); printf("%s",str_tmp); 這樣對嗎? ※ 編輯: jacky1989 (140.136.146.114), 10/27/2014 16:42:47
文章代碼(AID): #1KI_yIF6 (C_and_CPP)