mboost-dp1
strchr og const pointere
- Forside
- ⟨
- Forum
- ⟨
- Programmering
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.
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.
#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.
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.
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.arne_v (2) skrev:det er fixt i C++.
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++?
Jeg har nogen gange (i C) gjort noget lignende det her:
Så jeg tænker at man måske kan gøre sådan her:
Jeg har dog ikke testet det, og jeg har aldrig lavet noget i C++.
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++.
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.Emil Melgaard (5) skrev:Så jeg tænker at man måske kan gøre sådan her
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..
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.