Avatar billede warberg22 Nybegynder
16. september 2008 - 00:55 Der er 20 kommentarer og
1 løsning

Forskel på gcc og g++

Et kodeeksempel fra K&R afsnit 1.10

#include <stdio.h>
#define MAXLINE 1000


int max;
char line[MAXLINE];
char longest[MAXLINE];

int getline(void);
void copy(void);

main(){
    int len;
    extern int max;
    extern char longest[];

    max = 0;
    while ((len = getline()) > 0)
        if (len > max){
            max = len;
            copy();
        }
    if (max > 0) printf("%s", longest);
    return 0;


}

int getline(void){
    int c, i;
    extern char line[];
   
    for (i = 0; i < MAXLINE-1 && (c = getchar()) != EOF && c != '\n'; i++) line[i] = c;
    if (c == '\n'){
        line[i] = c;
        ++i;
    }
    //tilfoej nulterminering
    line[i] = '\0';
    return i;

}

void copy(void){
    int i;
    extern char line[], longest[];
    i = 0;
    while ((longest[i] = line[i]) != '\0')
          ++i;
}

Det er ok med gcc, men med g++ får jeg fejl, bl.a. :
type mismatch with previous external decl of ‘char longest []’

Hmm, er det noget med standarder, ANSI. Noget med måden man arbejder med arrays?
Avatar billede bertelbrander Praktikant
16. september 2008 - 01:03 #1
K&R er C, som man normalt oversætter med gcc
g++ bruges til at oversætte C++
Avatar billede warberg22 Nybegynder
16. september 2008 - 01:11 #2
Javist, men det hedder sig, at g++ også er C compiler :-) Har compilet flere andre simple eksempler. Lyder mærkeligt at der skulle være mangler/inkompatibilitet...
Avatar billede bertelbrander Praktikant
16. september 2008 - 02:13 #3
Der er meget C kode der kan kompileres som C++ kode, men der er også meget C kode der ikke kan kompileres om C++ kode. Så ofte kan man godt kompilere C kode som om det var C++ kode.

Men netop disse "extern char line[], longest[];" er ikke valid C++ kode, men perfekt valid C kode.
Avatar billede bertelbrander Praktikant
16. september 2008 - 02:14 #4
Og det store spørgsmål er ikke om du bruger det ene eller det andet program til at oversætte med, spørgsmålet er om du oversætter som C eller C++ kode.
Avatar billede warberg22 Nybegynder
16. september 2008 - 08:59 #5
Oki, men kan du så fortælle mig, hvordan jeg compiler ovenstående med g++? Compileren ser vel selv, at det er C den skal compile...?
Avatar billede arne_v Ekspert
16. september 2008 - 09:44 #6
Omdoeb filen fra .cpp til .c !
Avatar billede warberg22 Nybegynder
16. september 2008 - 10:09 #7
arne, det hedder den allerede ;-) Er ikke sikker på compileren kigger så meget på extensions. Spørgsmålet er, fejler gcc fordi den tror det er C++ eller fordi mener det er dårlig C?
Avatar billede arne_v Ekspert
16. september 2008 - 10:23 #8
Compileren kigger paa extensions !
Avatar billede arne_v Ekspert
16. september 2008 - 10:27 #9
Men nu har jeg proevet - og ja - selv som .c giver koden fejl.
Avatar billede arne_v Ekspert
16. september 2008 - 10:30 #10
Men slet de extern erklaeringer. De er ikke noedvendige i C.
Avatar billede warberg22 Nybegynder
16. september 2008 - 10:54 #11
Ikke forstået. Ideen er jo, at variablene erklæres uden for nogen funktion, og nøgleordet extern garanterer at funktionen bruger den eksterne definition af variablen, frem for en lokal variabel.
Avatar billede warberg22 Nybegynder
16. september 2008 - 11:04 #12
Ok, der er 2 løsninger her. Den ene er at slette de linier hvor ordet "extern" indgår, hvilket virker i kraft af at programmet udføres i den tekstuelle rækkefølge - men det var jo ikke helt meningen med øvelsen...?

Den anden er, at line og longest igen initialiseres som "char line[MAXLINE]" i funktionerne. Det synes jeg er grimt. g++ bør da kunne se at arrayet allerede er initialiseret.
Avatar billede arne_v Ekspert
16. september 2008 - 11:06 #13
Jo. Men der er ingen forskel i den kode du har postet ovenfor.
Avatar billede arne_v Ekspert
16. september 2008 - 11:08 #14
Dit andet forslag vil ikke virke, da du saa faar forskellige variable.
Avatar billede warberg22 Nybegynder
16. september 2008 - 11:15 #15
Angående sidstnævnte; den er stadig extern. Skulle have skrevet:
"extern char line[MAXLINE]"
Avatar billede bertelbrander Praktikant
16. september 2008 - 19:21 #16
Hvis ikke jeg tager meget fejl vil g++ altid oversætte som C++, mens gcc kikker på extension.
Avatar billede arne_v Ekspert
16. september 2008 - 19:35 #17
Muligt, men den maa da stadig kigge paa extension for at kunne adskille .cpp fra .s og .a
Avatar billede warberg22 Nybegynder
16. september 2008 - 21:58 #18
Jeg har forhørt mig hos en kyndig C-programmør, og moralen er vist bare, at man ikke skal brug g++ til C, selvom det siges at være muligt. Tak for jeres bidrag.
Avatar billede bertelbrander Praktikant
16. september 2008 - 22:34 #19
Det var vel sådan set det jeg forsøgte at forklare...
Men pænt af dig at give Arne point..
Avatar billede warberg22 Nybegynder
17. september 2008 - 10:36 #20
Hva ba'? Der var ikke nogen der havde angivet svar...
Avatar billede bertelbrander Praktikant
17. september 2008 - 19:23 #21
Nu er det ikke fordi det skal gøres til et stort problem.
Men normalt ville man, hvis der er en der har bidraget til løsningen af problemet, uden at have lagt et "svar" men udelukkende "kommentarer", bede personen om at lægge et svar som man så kunne acceptere.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester