2014-09-08 19 views
12

Sadece diğer dillerden gelen C++ öğretmeye başlıyorum. Bir (öğrenci) dosyası tarafından oluşturulan API'yi tutarlı bir şekilde kontrol etmenin bir yolunun olmasını diliyorum. Başlıklar Sanity

bir öğrenci bu dosyayı gönderir varsayalım:

Aslında
// this is stu.cpp 
#include <iostream> 
using namespace std; 
double x(int y) {return y+0.5;} 

, bazı diğer işlevi tanımlamak için öğrenci sorulan varsayalım int x (int). Bu kodu çalıştırarak bu kontrol edebilmek istiyorum:

// this is stu.h 
int x(int); 

// this is gra.cpp 
#include "stu.h" 
#include <iostream> 
using namespace std; 

int main() { 
    cout << x(0); // test their code 
} 

Yani öğrencinin uygulanmasının gereğine arayüzünü eşleşti görmek çalışıyor ve ben ümit girişi 0. üzerinde test ediyorum

bu olmaz derlemek. Ben

g++ -Wall -Wconversion *.cpp -o gra 
./gra 

yaptığınızda Ama O derler ve ben ayrı ayrı iki dosya derlemek ve sonra bunları bağlamak bile bu durum kalır çıktı 0. vererek çökmesini olmadan çalışır.

nm'un dönüş türlerini listelemediğini biliyorum. Bu, dönüş değerleri eşleşmediğinde iki dosyayı birbirine bağlayabilmemizin sebebi mi? Bunu test etmenin aklı başında bir yolu var mı? (Derleme zamanı gibi varsayımlar var mı?)

Ya da int ve double, interconvertible nedeniyle belirli bir hata mı? Bunu yakalayabilecek ek derleyici seçenekleri var mı?

// this is gra.cpp 
#include "stu.h" 
#include "stu.cpp" 
#include <iostream> 
using namespace std; 

int main() { 
    cout << x(0); // test their code 
} 

Ve tabii sadece gra.cpp derlemek:

+3

stu.cpp 'stu.h' içeriyorsa bir hata alırsınız. –

+2

Yup, '-Wall -Werror -Wextra' ile derlemelisiniz ve öğrencilere uygulayabilecekleri başlık dosyasını vermelisiniz ('# include'-ing içerir). –

+0

'g ++ -flto -Wall -Wconversion * .cpp -o gra' ile çalışabilirsiniz –

cevap

8

Öğrencinin kodunu ayrı ayrı derlemek yerine, neden doğrudan test programınıza dahil etmiyorsunuz?

int x(int); 
#include <stu.cpp> 

Sonra böyle güzel bir hatayı almalısınız:

a.cpp:2:8: error: functions that differ only in their return type cannot be overloaded 

bu öğrencinin kodunu derlemek için "normal" bir yol olmasa da, bu kod kontrol edilebilir olduğunu garanti eder.


Alternatif olarak, öğrencinin C++ dosyasını derlerken istediğiniz API içeren bir dosyasının eklenmesinin derleyici zorlamak için -include (GCC, Clang) gibi bir derleyici komut satırı seçeneğini kullanabilirsiniz. Örnek olarak:

api.h

int x(int); 

g++ stu.cpp -include api.h derleme ve uygun hata yükseltilecektir.

+1

Sembol yeniden tanımlaması gibi yanlış pozitiflere yol açabilir. –

+0

@OliCharlesworth: Neden? İlk çözüm, stu.cpp'yi transclude eder, bu yüzden stu.cpp' bağımsız olarak derlenmez. İkinci çözüm, sadece işlev prototiplerini içermesi gereken, yalnızca sınıf öğrencilerinin tercihine bir başlık enjekte eder. Sembolün yeniden tanımlanma hatalarının nerede gerçekleşeceğini görmüyorum? – nneonneo

+0

Başka bir cevap, şimdi silindi, oldukça zarif olan fonksiyon göstergelerini kullanarak, özellikle de bir öğrencinin bir yöntemi tanımlamak için atladığını kontrol etmeyi kolaylaştıracağı için. Bu yaklaşımla, yöntem hiç tanımlanmadığında bir hata ortaya çıkarmanın bir yolu var mı? C++ 'nin otomatik olarak sahnelerin ardındaki çeşitliliği otomatik olarak dönüştürdüğünden beri her zaman işe yaramayacağından endişeleniyorum. – daveagp

1

Aşağıdaki yapabilirsiniz.