mboost-dp1

strchr og const pointere


Gå til bund
Gravatar #1 - kasperd
9. okt. 2011 22:22
Jeg har bemærket at strchr i C tager en const char pointer som argument og returnerer en pointer som ikke er const. Jeg kan godt se en pointe i at gøre det på den måde, da begge følgende stykker kode så vil kunne compileres uden warnings:

void f1(char *s)
{
char *p=strchr(s,' ');
/* ... */
}

void f2(const char *s)
{
const char *p=strchr(s,' ');
/* ... */
}

Men jeg synes da samtidigt det er lidt uheldigt at jeg kunne skrive et stykke kode som følgende, der også vil compileres uden warnings:

void stupid(const char *s)
{
char *p=strchr(s," ");
if (p) *p=0;
}

På den måde kan man jo helt uden brug af casting slippe af sted med at skrive til en const pointer og ikke få nogen warnings.
Gravatar #2 - arne_v
9. okt. 2011 22:33
#1

C understøtter ikke function overload.

Det gør C++.

Så det er fixt i C++.

To funktioner - hvor retur værdi har samme type som første argument.
Gravatar #3 - arne_v
9. okt. 2011 23:28
#2

Og før nogen undrer sig.

GCC (g++) har vist lidt problemer med at få dette lavet korrekt.

http://gcc.gnu.org/gcc-4.4/porting_to.html hævder at det blev implementeret i 4.4, men hverken min 4.4 Windows eller 4.6 Linux har det.
Gravatar #4 - kasperd
10. okt. 2011 07:39
arne_v (2) skrev:
det er fixt i C++.
Det er da et skridt i den rigtige retning. Men en C compiler kunne også give en warning selvom der ikke er noget i sproget som direkte hjælper med det.

Gcc kan f.eks. checke argumenterne til printf selvom hvilke argumenter der er gyldige afhænger af en streng konstant.

Når en compiler kan håndtere printf som et specialtilfælde, så kunne den også have håndteret strchr og lignende funktioner og give en warning hvis den bruges til at lave en const pointer om til en ikke-const.

Din kommentar fik mig til at prøve at compilere min kode med g++ for at se om det kunne afsløre nogle ting jeg burde ændre. Jeg løb ind i et problem med en konstruktion som denne:

struct {
char a[3];
} v={.a={1,2,3}};

Hvis jeg compilerer det med gcc og slår alle warnings til compilerer det stadig uden en eneste warning.

Hvis jeg derimod compilerer det med g++ får jeg en fejl: error: expected primary-expression before ‘.’ token

Er der en korrekt syntaks for initialisering af structs som er gyldig i både C og C++?
Gravatar #5 - Emil Melgaard
10. okt. 2011 13:46
Jeg har nogen gange (i C) gjort noget lignende det her:

typedef struct {
char a[3];
} v_t;

v_t v = { {1,2,3} };


Så jeg tænker at man måske kan gøre sådan her:

struct {
char a[3];
} v = { {1,2,3} };


Jeg har dog ikke testet det, og jeg har aldrig lavet noget i C++.
Gravatar #6 - kasperd
10. okt. 2011 14:21
Emil Melgaard (5) skrev:
Så jeg tænker at man måske kan gøre sådan her
Det virker, men det kræver til gengæld at man initialiserer alle felterne, og man skal kunne huske rækkefølgen på felterne for at kunne skrive koden rigtigt og for at kunne forstå koden efterfølgende.
Gravatar #7 - arne_v
10. okt. 2011 14:25
#4

De kunne lave et "special tilfælde".

Men jeg er lidt skeptisk overfor ideen. At gøre C "sikker" vil være skruen uden ende.

C++ er opfundet.
Gravatar #8 - arne_v
10. okt. 2011 14:29
kasperd (4) skrev:

Din kommentar fik mig til at prøve at compilere min kode med g++ for at se om det kunne afsløre nogle ting jeg burde ændre. Jeg løb ind i et problem med en konstruktion som denne:

struct {
char a[3];
} v={.a={1,2,3}};

Hvis jeg compilerer det med gcc og slår alle warnings til compilerer det stadig uden en eneste warning.

Hvis jeg derimod compilerer det med g++ får jeg en fejl: error: expected primary-expression before ‘.’ token

Er der en korrekt syntaks for initialisering af structs som er gyldig i både C og C++?


.a er det man kalder "designated initializers".

Det er en ny feature i C99.

C++ bygger på C89 ikke C99.

Metoden i #5 med all felter i den rigtige rækkefølge bør virke i C89, C99, C++ etc..
Gravatar #9 - arne_v
14. okt. 2011 17:37
#8

C++ er her C++98.

Men så vidt jeg ved indeholder C++0x/C++2011 heller ikke designated initializers.
Gå til top

Opret dig som bruger i dag

Det er gratis, og du binder dig ikke til noget.

Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.

Opret Bruger Login