Especificação de desenvolvimento de projeto de engenharia C / C ++
Declaração e definição de função
Declaração: informe ao sistema que existe uma função que pode ser declarada repetidamente.
Definição: como a função é implementada e não pode ser repetida.
Seu local de erro:
Programa fonte —precompilado -------> *** compilado (não declarado) *** - arquivo objeto gerado. O ---------> link (indefinido) -> arquivo executável
- Escreva a declaração e a definição da função juntas
#include<stdio.h>
int add(int a, int b) {
return a+b;
}
int main() {
add(2, 3);
return 0;
}
A função chamada deve ser definida antes.
#include<stdio.h>
void fundB(int n) {
if (n == 0) return ;
printf("fundB: %d\n", n);
return ;
}
void fundA(int n) {
if (n == 0) return ;
printf("fundA: %d\n", n);
fundB(n - 1);
return ;
}
int main() {
fundA(5);
return 0;
}
- Declare na frente, defina atrás
#include<stdio.h>
void fundA(int);
void fundB(int);
void fundB(int n) {
if (n == 0) return ;
printf("fundB: %d\n", n);
fundA(n -1);
return ;
}
void fundA(int n) {
if (n == 0) return ;
printf("fundA: %d\n", n);
fundB(n - 1);
return ;
}
int main() {
fundA(5);
return 0;
}
g++ testAB.cpp -c // 只编译不链接 产生对象文件即.o文件。
g++ testAB.o //链接对象文件。
A função é definida em outras funções
#include<stdio.h>
void fundA(int);
void fundB(int);
int main() {
fundA(5);
return 0;
}
#include<stdio.h>
void fundA(int );
void fundB(int );
void fundB(int n) {
if (n == 0) return ;
printf("fundB: %d\n", n);
fundA(n -1);
return ;
}
void fundA(int n) {
if (n == 0) return ;
printf("fundA: %d\n", n);
fundB(n - 1);
return ;
}
Compile os dois arquivos de origem primeiro e, a seguir, vincule os dois arquivos de objeto;
g++ -c unite.cpp
g++ -c testAB.cpp
g++ testAB.o unite.o
./a.out
Arquivos de cabeçalho e fonte
g + ± E test.h Visualize o conteúdo importado de include.
Definição condicional. Se não houver um arquivo de cabeçalho definido, defina o cabeçalho. Resolva o problema de compilar uma vez e repetir.
#ifndef _HEADER2_H
#define _HEADER2_H
#endif
Arquivo de cabeçalho: contém apenas a declaração da função;
Arquivo fonte: contém apenas a definição da função:
Arquivo de cabeçalho Header1 header1.h
#ifndef _HEADER1_H
#define _HEADER1_H
void funcA(int);
void funcB(int);
#endif
Arquivo de origem Header1 header1.cc
#include<stdio.h>
#include"header1.h"
void funcA(int n) {
if(n == 0) return ;
printf("funcA: %d\n", n);
funcB(n-1);
return ;
}
void funcB(int n) {
if(n == 0) return ;
printf("funcB: %d\n", n);
funcA(n - 1);
return ;
}
Arquivo de cabeçalho Header2 header2.h
#ifndef _HEADER2_H
#define _HEADER2_H
#include<stdio.h>
#include"header1.h"
void funcC(int, int);
#endif
Arquivo de origem do Cabeçalho2 header2.cc
#include"header1.h"
#include<stdio.h>
void funcC(int a, int b) {
printf("funcC: %d + %d = %d\n", a, b, a + b);
funcA(a);
return ;
}
Arquivo de cabeçalho Header3 header3.h
#ifndef _HEADER3_H
#define _HEADER3_H
#include"header1.h"
void funcD(int a, int b);
#endif
Arquivo de origem Header3 header3.cc
#include"header1.h"
#include<stdio.h>
void funcD(int a, int b) {
printf("funcD: %d + %d = %d\n", a, b, a + b);
funcA(a);
return ;
}
Programa principal: test.cpp
#include<stdio.h>
#include"header1.h"
#include"header2.h"
#include"header3.h"
int main() {
funcA(5);
funcC(6, 7);
funcD(7, 8);
return 0;
}
Compilar e vincular:
g++ -c test.cpp
g++ -c header1.cc
g++ -c header2.cc
g++ -c header3.cc
g++ test.o header1.o header2.o header3.o
./a.out
Especificação de desenvolvimento e biblioteca de links estáticos
No arquivo do projeto
-
incluir arquivo de cabeçalho.h
-
arquivo fonte src.cc + arquivo objeto.o
-
biblioteca de link estático lib. um pacote .lib de arquivos de objeto gerados por um conjunto de arquivos de origem
Comando de embalagem:
ar-r libXXXX.a header1.o header2.o header.o
-
xxx.cpp
-
makefile
inclua <XXX.h>. Encontre XXX.h no caminho da biblioteca do sistema
inclua "XXX.h". Encontre XXX.h na pasta atual
Se você alterar "" para <>, será necessário adicionar include ao caminho da biblioteca do sistema:
g++ -I /include -c src/header1. cc
O comando de link de xxx.o de xxx.cpp e a biblioteca de link estático:g++ test.o -L./lib -ltest
ferramenta makeflie
.PHONY:clean
all: lib/libtest.a test.o
g++ test.o -L./lib -ltest
test.o: test.cpp
g++ -I ./include/ -c test.cpp
clean:
rm -rf a.out test.o