いつもお世話になっています。C言語初心者でただいま勉強中です。マクロを用いて単体テストと結合テストが同じソースコードで行えるようなプログラムを作りたいんですが、マクロを定義してもコンパイル時にmainが2つあって区別できないと怒られます。どのようにすればmainと関数にうまくわけられますか?以下がコードです。
C言語
1コード(ファイル名 main.c) 2 3 4#include<stdio.h> 5#include "header02.h" 6#define SCAN scanf("%d %d",&t.p[i].x, &t.p[i].y) 7//#define PRINT printf("%d %d\n",t.p[i].x,t.p[i].y) 8//#define SYUTU printf("Area = %f\n",calcarea(t)) 9int main()/*コンパイルする時にREADならmain関数の処理*/ 10{ 11 int i; 12 Triangle t; 13 for(i = 0; i < 3; i++){ 14#if defined READ 15 SCAN; 16 #endif/*READの時の処理の最後を実行する*/ 17 // scanf("%d %d",&t.p[i].x, &t.p[i].y); 18 } 19 #if defined WROTE/*gcc -DREAD main02.cのとき*/ 20 // SYUTU; 21 // printf("Area = %f\n",calcarea(t)); 22 printf("Area = %f\n",calcarea(t)); 23 #endif/*READの時の処理の最後を実行する*/ 24 return 0; 25 26} 27/* for component test */ 28double calcarea(Triangle t)/*コンパイルする時にWROTEなら関数の処理*/ 29{ 30 int i; 31 for(i = 0; i < 3; i++){ 32 printf("%d %d\n",t.p[i].x,t.p[i].y); 33 } 34 return 0; 35} 36 37```ファイル名(calc.c) 38```C言語 39#include<stdio.h> 40#include "header02.h" 41int main()/*コンパイルする時にWROTEならmain関数の処理*/ 42{ 43 44 Triangle t = {1,0,0,1,0,0}; 45#if defined WROTE 46#endif 47 #if defined READ/*READの時の処理の最後を実行する*/ 48 printf("Area = %f\n",calcarea(t)); 49 #endif 50 return 0; 51} 52 53double calcarea(Triangle t)/*コンパイルする時にREADなら関数の処理*/ 54{ 55 double area; 56 57 area = (double)((t.p[2].x - t.p[1].x)*(t.p[0].y - t.p[1].y) - 58 (t.p[2].y - t.p[1].y)*(t.p[0].x - t.p[1].x))/2.0; 59 return myabs(area); 60}
コンパイル操作
gcc -c main.c
gcc -c calc.c
gcc main.o calc.o
コンパイルエラー
duplicate symbol _main in:
main02.o
calc02.o
duplicate symbol _calcarea in:
main02.o
calc02.o
ld: 2 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
どうかよろしくお願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。