Re: Headers
А что тут объяснять? Делаешь два cpp и два h файла. Компилировать тебе придётся оба *.cpp файла, а затем их надо вместе слинковать. Думаю, что для точного ответа надо знать, какой у тебя компилятор.
В чем проблема-то?
Определение в хедер. Реализация в цпп.
Блин. Почитай что-нибудь по основам, что ли.
компиллятор - Borland Bulder C++ 6.0. я все вроде бы сделал - а он мне все равно пишет:
"Unreserved external..." вот я и не знаю в чем проблема...
ладно, давай сюда листинг файлов.
то есть "unresolved external"
ExtFun.h:
double extf(double);
ExtFun.cpp:
#include "ExtFun.h"
double extf(double x)
{ return x*x;
}
Unit1.cpp:
//---------------------------------------------------------------------------
#include "ExtFun.h"
#include <iostream.h>
#include <conio.h>
//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{ cout<<extf(3);
getch;
return 0;
}
//---------------------------------------------------------------------------
Ну да ладно.
не <iostream.h>, а <iostream> и т.д.
Как минимум не cout, а std::cout и т.д
PS Как максимум, всегда пиши в хедерах либо
#pragma once(для MSVC++)
<содержимое хедера>
либо
#ifndef __<filename>_h__(в общем случае)
#define __<filename>_h__
<содержимое хедера>
#endif //__<filename>_h__
Пригодится еще.
можно iostream.h, тогда std:: не надо писать.
Писать все-таки на плюсах надо.
Ошибку-то дай
это плюсы.
+1 =)
Ошибка, судя по всему, при линковке. Может, ты забыл второй cpp "добавить в проект", или как там это у Борланда называется ?
Холиворчик на тему, как писать на плюсах, чтобы все было шоколадно
#ifndef __ExtFun_h__
#define __ExtFun_h__
...
#endif
ничего не дало, странно... все равно ошибка при линковке
зато добавление файла ExtFun.cpp в проект действительно
привело в успешной сборке! по-видимому, ошибка в этом и была...
Все равно спасибо всем!
#ifndef __ExtFun_h__Конечно, не дало.
#define __ExtFun_h__
...
#endif
Когда проект станет больше - даст.
Просто, я так понял, ты - новичок. Поэтому я тебе предложил сразу писать так, чтобы все учесть.
На будущее.
#ifndef _DEFINITION_FOR_NOT_TO_USE__EXTFUN_H__TWICE__2005_09_30_
ага, и добавлять сгенерённый GUID, чтобы не дай Бог, не совпало с другими
короче делаешь так:
Делаешь 2 cpp файла, b.cpp и main.cpp
и один h файл b.h
в b.h прописываешь:
// b.h : header file
#ifndef __B_H
#define __B_H
в b.cpp прописываешь
// b.cpp
#include "b.h"
double extf(double x)
{
return x*x;
}
а в main.cpp прописываешь:
// main.cpp
#include "b.h"
#include <iostream.h>
void main
{
cout << extf(3);
}
у меня все заработало с первого раза
double extf(double);
#endif __B_H
бляяя, очепятался, сча исправлю. . .
#ifndef __B_H
#define __B_H
double extf(double);
#endif __B_H
// b.cpp
#include "b.h"
double extf(double x)
{
return x*x;
}
// main.cpp
#include "b.h"
#include <iostream.h>
void main
{
cout << extf(3);
}
Я попробовал в Борланде Билдере собрать Ваш вариант -
все равно до тех пор пока файл b.cpp не добавлен в проект
возникает ошибка линковщика - unresolved external extf(double)
> возникает ошибка линковщика - unresolved external extf(double)
так и должно быть.
все cpp-файлы должны быть добавлены в проект для успешной сборки.
если ты хочешь использовать файл, не выкладывая в явном виде его исходника (cpp можешь откомпилять его в вид obj и подключить к проекту, или в вид lib и не подключать (но ссылаться в свойствах проекта).
// b.h : header file
#ifndef __B_H
#define __B_H
double extf(double);
#include "b.cpp"
#endif __B_H
// b.cpp
#include "b.h"
double extf(double x)
{
return x*x;
}
// main.cpp
#include <iostream.h>
#include "b.h"
void main
{
cout << extf(3);
}
Тогда, ИМХО, можно будет не добавлять твой злополучный файл в проект - он будет в .h-файле включаться
кардинально
A - генератор случайных чисел.
B - тест A. Подсчёт объёма шара, вписанного в куб со стороной 1.
DEFINITION A;
const int seedLimit = 2147483647;
int Int(int);
void Randomize;
float Real;
void SetSeed(int);
END A;
DEFINITION B;
IMPORT A;
void Do;
END B;
a.c:
#include <assert.h>
#include <time.h>
#define multiplier 48271
#define modulus 2147483647
#define quotient (modulus / multiplier)
#define remainder (modulus % multiplier)
const int A_seedLimit = modulus;
static int seed = 0;
static void ComputeNextSeed
{
int low, high;
low = seed % quotient;
high = seed / quotient;
seed = multiplier * low - remainder * high;
if (seed <= 0)
{
seed += modulus;
}
}
int A_Int(int n)
{
assert(0 < n);
assert(n < A_seedLimit);
ComputeNextSeed;
return (n * seed) / modulus;
}
void A_Randomize
{
int i;
seed = time(NULL);
assert(seed > 0);
for (i = 0; i <= 7; i++)
{
ComputeNextSeed;
}
}
float A_Real
{
ComputeNextSeed;
return (float)seed / (float)modulus;
}
void A_SetSeed(int n)
{
int i;
assert(0 < n);
assert(n < A_seedLimit);
seed = n % modulus;
for (i = 0; i <= 7; i++)
{
ComputeNextSeed;
}
}
void A__Init
{
A_Randomize;
}
a.oh:
extern void A__Init;
extern const int A_seedLimit;
extern void A_Randomize;
extern float A_Real;
extern int A_Int(int);
extern void A_SetSeed(int);
b.c:
#include <stdio.h>
#include "a.oh" /* IMPORT A */
#define n 100000000
#define Sqr(x) x) * (x
void B_Do
{
int i, m;
float x, y, z;
A_Randomize;
m = 0;
for (i = 0; i < n; i++)
{
x = A_Real;
y = A_Real;
z = A_Real;
if (Sqr(x - 0.5) + Sqr(y - 0.5) + Sqr(z - 0.5) < Sqr(0.5
{
m++;
}
};
printf("%f\n", (float)m / (float)n);
}
void B__Init
{
}
b.oh:
extern void B__Init;
extern void B_Do;
*.oh - интерфейсы для модулей.
В основной программе нужно вызвать процедуру Do из модуля B:
main.c:
#include "a.oh" /* IMPORT A */
#include "b.oh" /* IMPORT B */
int main
{
A__Init;
B__Init;
B_Do;
return 0;
}
Makefile:
CC ?= gcc
CFLAGS += -g -Wall -O3
SRCS = a.c b.c main.c
OBJS = ${SRCS:.c=.o}
EXE = exe
all: ${EXE}
${EXE}: ${OBJS}
${CC} -o $@ $?
strip $@
.c.o:
${CC} ${CFLAGS} -c $< -o $@
clean:
rm -f *.o ${EXE}
DEFINITION A;
const int seedLimit = 2147483647;
int Int(int);
void Randomize;
float Real;
void SetSeed(int);
END A;
А в чем маза слова DEFINITION?
Это у тебя макрос такой?
И зачем тогда ";" в конце строки?
Оставить комментарий
shurik0906
Народ, кто-нибудь может внятно разъяснить как сделать херер-файл,так чтобыобъявленные в нем и определенные в соответствующем .срр-файле функции
можно было бы использовать в другом .срр-файле, подключив (#include) только
хедер, а не сам .срр-модуль?