Что означает наличие у имени или типа определенной языковой связи?

Согласно (c) ANSI ISO / IEC 14882: 2003, стр. 127:

Вложенные спецификации связывания. При вложении спецификаций связи, самое сокровенное определяет язык. Спецификация связи не устанавливает объем. Спецификация связывания должна встречаться только в области пространства имен (3.3). В спецификации связи указанная языковая связь применяется к типам функций всех деклараторов функций, именам функций и именам переменных, введенным объявлением (ями).

extern "C" void f1(void(*pf)(int));
// the name f1 and its function type have C language
// linkage; pf is a pointer to a C function

extern "C" typedef void FUNC();
FUNC f2;
// the name f2 has C++ language linkage and the
// function's type has C language linkage

extern "C" FUNC f3;
// the name of function f3 and the function's type
// have C language linkage

void (*pf2)(FUNC*);
// the name of the variable pf2 has C++ linkage and
// the type of pf2 is pointer to C++ function that
// takes one parameter of type pointer to C function

Что все это означает? Например, какую связь имеет функция f2 () , связь с языком C или C ++?

Как указал @Johannes Schaub, в Стандарте нет реального объяснения того, что это означает, поэтому он могут по-разному интерпретироваться в разных компиляторах.

Объясните, пожалуйста, различия в объектном файле:

  • имя функции с привязкой к языку C и с привязкой к языку C ++.
  • Тип функции с привязкой к языку C и привязкой к языку C ++. Я компилирую программу с g ++ -x c ++ -o source.c он продолжает начинаться с -2147483648 выше 2147483647 .... #include #include # ...

    почему я не могу заставить работать int64? Я компилирую программу с g ++ -x c ++ -o source.c он продолжает начинаться с -2147483648 выше 2147483647 ....

    #include <stdint.h>
    #include <inttypes.h>
    #ifdef __cplusplus
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #else
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #endif
    
    int main(int argc, char* argv[])
    {
        int64_t i;
        for(i = 0; i < argc; ++i)
            printf("argv[%d]: %s\n", i, argv[i]);
    
        char string [512];
        int64_t a1 = atoi((const char*) gets(string));
        int64_t limit = a1 + 99999999999
    
        while(a1 <= limit)
        {
            char command[10000];
            sprintf(command, "%d", a1);
            FILE* pFile = fopen ("myfile.txt","wa");
            fprintf (pFile, "%s\n", command);
            fclose (pFile);
    
           a1= a1 + 4321;
        }
        return EXIT_SUCCESS;
    }
    

    c

0
задан Jonas 23 April 2011 в 12:47
поделиться