Prendete questo codice:Quanto l'estensibilità della libreria standard C influisce sui programmi C++?
int issuecode(int i)
{
return 2 * i;
}
int main(int argc, char **argv)
{
return issuecode(argc);
}
Il modo in cui ho capito, se compilato come un programma C, avrà un comportamento indefinito. Ho ragione in base a standard di queste citazioni:
C99, 7,26 (o C11, 7,31)
I seguenti nomi sono raggruppate in singole intestazioni per convenienza. Tutti i nomi esterni descritti di seguito sono riservati, indipendentemente dalle intestazioni incluse nel programma.
C99, 7.26.2 (o C11, 7.31.2)
I nomi delle funzioni che iniziano con uno o
is
to
, e una lettera minuscola può essere aggiunto alle dichiarazioni del<ctype.h>
intestazione.
C99, 7.1.3 (o C11, 7.1.3)
Ogni intestazione dichiara o definisce tutti gli identificatori elencati nella sottoclausola associato e opzionalmente dichiara o definisce identificatori elencati nella sua libreria delle direzioni future associate, subclause e identificatori che sono sempre riservati per qualsiasi uso o per uso come identificatori di scope di file.
[...]
- Tutti gli identificatori con collegamento esterno in uno qualsiasi dei seguenti sottoclausole (comprese le future direzioni della biblioteca) sono sempre riservati per l'uso come identificatori con collegamento esterno.
[...] Se il programma dichiara o definisce un identificatore in un contesto in cui esso è riservata (non come consentito dalla 7.1.4), o definisce un identificatore riservata come un nome di macro, il il comportamento non è definito.
base a quanto sopra, credo che il nome della funzione issuecode
è in realtà riservato per l'uso in <ctype.h>
, e così il programma ha tecnicamente UB.
Domanda 0 (controllo di integrità): la mia lettura dello standard è corretta e il comportamento del programma non è definito tecnicamente?
Domanda 1: Il programma avrà UB se compilato come codice C++?
Credo che la risposta sia "no", come dalle citazioni seguenti, direi che "le future direzioni di libreria" di C non fanno parte della libreria standard C++, ma non ne sono proprio sicuro.
C++ 11, 21.7
Tabelle 74, 75, 76, 77, 78 e 79 descrivono intestazioni
<cctype>
,<cwctype>
,<cstring>
,<cwchar>
,<cstdlib>
(conversioni carattere), e<cuchar>
, rispettivamente.Il contenuto di questi connettori sono uguali alle intestazioni standard di C biblioteca
<ctype.h>
,<wctype.h>
,<string.h>
,<wchar.h>
, e<stdlib.h>
e l'intestazione C Unicode TR, rispettivamente, con le seguenti modifiche:
Nessuna delle "successive modifiche" menziona gli identificatori riservati aggiuntivi. La Tabella 74 è un elenco tassativo di nomi di funzioni come isdigit
e isalnum
.
C++ 11, C.2
1. Questa sottoclausola riassume il contenuto della libreria standard C++ incluso dalla libreria standard C. Riassume anche i cambiamenti espliciti nelle definizioni, dichiarazioni o comportamenti dalla libreria C standard annotata in altri subclaus (17.6.1.2, 18.2, 21.7).
7. La libreria standard C++ fornisce 209 funzioni standard dalla libreria C, come indicato nella tabella 153.
Nuovamente, tavolo 153 è una lista taxative.
Domanda 2: presupponendo io sono sbagliato su domanda 1 e il programma fa in realtà hanno UB in C++, così, sarebbe la seguente modifica influire su questo?
namespace foo {
int issuecode(int i)
{
return 2 * i;
}
}
using namespace foo;
int main(int argc, char **argv)
{
return issuecode(argc);
}
Nota: Le citazioni standard sono prese da correnti d'aria N1256 (C99), N1570 (C11) e N3242 (C++ 11), che sono le più recenti bozze pubblicamente disponibili per la rispettiva lingua versioni.
0. Partite di checksum. 1. Penso di sì, la libreria standard C++ ** contiene, come sottoinsieme ** tutta la libreria standard C (anche le vecchie intestazioni .h deprecate). 2. Penso di sì di nuovo, perché ora non ci si trova nello spazio dei nomi 'std ::'. (Il meglio sarebbe provarlo su un DS9K, però.) –
+1, ma ... sul serio? Un programma C++ che contiene una funzione il cui nome inizia con 'is' ha UB? Se è così, ho scritto UB tutto il tempo ... –
@AndyProwl Quelli erano i miei pensieri esattamente quando ho letto quella parte dello standard C. Ecco perché ho fatto questa domanda comunque. E tecnicamente, sono solo funzioni globali non statiche; motivo in più per usare gli spazi dei nomi ;-) – Angew