support - Définition inline de la table C to C++




c++ guidelines support library (4)

J'ai un code en C qui compile et fonctionne correctement et j'aimerais utiliser un code similaire en C ++:

static const char* aTable[12] = {
    [4]="seems",
    [6]=" it  ",
[8]="works",};

int main(){
    printf("%s%s%s", aTable[4],aTable[6],aTable[8]); 
    return 0;
}

Maintenant, si je le mets dans un fichier .c et compile avec gcc cela fonctionne. Mais si je le mets dans un fichier .cpp et le compile avec g++ , j'obtiens les erreurs suivantes:

test_cpp.cpp:5:3: error: expected identifier before numeric constant
test_cpp.cpp:5:4: error: type '<lambda>' with no linkage used to declare function 'void<lambda>::operator()() const' with linkage [-fpermissive] 
test_cpp.cpp: In lambda function: test_cpp.cpp:5:5: error: expected '{' before '=' token 
test_cpp.cpp: At global scope: test_cpp.cpp:5:5: warning: lambda expressions only available with
    -std=c++0x or -std=gnu++0x [enabled by default] 
test_cpp.cpp:5:6: error: no match for 'operator=' in '{} = "seems"' test_cpp.cpp:5:6: note: candidate is: test_cpp.cpp:5:4: note: <lambda()>&<lambda()>::operator=(const<lambda()>&) 
test_cpp.cpp:5:4: note:   no known conversion for argument 1 from 'const char [6]' to 'const<lambda()>&' 
test_cpp.cpp:6:3: error: expected identifier before numeric constant
test_cpp.cpp:6:4: error: type '<lambda>' with no linkage used to declare function 'void<lambda>::operator()() const' with linkage [-fpermissive]

Existe-t-il un moyen d’exprimer que je ne déclare pas une fonction lambda, mais simplement pour remplir un tableau?

Je voudrais garder la partie suivante:

[4]="seems",
[6]=" it  ",
[8]="works",

car il provient d'un fichier généré automatiquement ...


Comme indiqué ci-dessus, ce type d'initialisation n'est pas pris en charge en C ++, mais vous pouvez utiliser la fonction lambda pour initialiser static array<const char*, 12> comme ceci:

#include <array>
#include <cstdio>

static const std::array<const char*, 6> aTable = []() {
    std::array<const char*, 6> table;
    table[0] = "Hello";
    table[3] = ", ";
    table[5] = "world!";
    return std::move(table);
}();

int main() {
    printf("%s%s%s\n", aTable[0], aTable[3], aTable[5]);
    return 0;
}

Démo sur coliru

Notable, ce compilateur fera RVO ici, et l'initialisation sera effectuée sur place. Ceci est un assemblage généré par g ++ - 5.4.0:

<_GLOBAL__sub_I_main>:
movq   $0x40064c,0x200bc5(%rip)        # 601060 <_ZL6aTable>
movq   $0x400652,0x200bd2(%rip)        # 601078 <_ZL6aTable+0x18>
movq   $0x400655,0x200bd7(%rip)        # 601088 <_ZL6aTable+0x28>
retq   

Il n'y a aucun moyen de faire ça. C ++ n'a jamais adopté cette syntaxe particulière.

Dans votre cas, puisque la table est générée automatiquement, je la placerais simplement dans un fichier C. Tant qu'il n'est pas marqué comme static , vous pouvez y accéder sans problème à partir de code C ++.


Vous pouvez facilement mélanger du code C et C ++.

Vous devriez garder le code C à compiler avec le compilateur C (gcc), le reste du code peut être en C ++ et être compilé avec le compilateur C ++ (g ++). liez ensuite tous les fichiers objet (.o) ensemble.

comme ça:

nom du fichier: ac

const char* aTable[12] = {
    [4]="seems",
    [6]=" it  ",
[8]="works",};

nom du fichier: b.cpp

#include <cstdio>
extern "C" const char* aTable[12];   
int main(){
    printf("%s%s%s", aTable[4],aTable[6],aTable[8]); 
    return 0;
}

Maintenant compiler:

gcc -c a.c -o a.o
g++ -c b.cpp -o b.o
g++ b.o a.o -o all.out

Maintenant, lancez l'exécutable (all.out) et vous verrez que tout fonctionnera.

Notez simplement que pour les fonctions, vous devez ajouter extern "C" avant la déclaration dans le fichier cpp.


[4]= est un initialiseur désigné , l'une des fonctionnalités C non prises en charge par C ++.

Voici une list qui essaie de répertorier les fonctionnalités C99 prises en charge par C ++ 17. Faites défiler vers le bas pour voir ceux qui ne sont pas pris en charge.

Il est important de réaliser que C ++ n'est en aucun cas un sur-ensemble de C.







g++