Проблема с использованием кода C в C ++ с внешним "C" - PullRequest
3 голосов
/ 10 ноября 2019

Я знаю, когда я хочу связать код C как код C в C ++, если я буду использовать extern "C". Но со следующим кодом:

/* file.h */
some (void)
{
    return 10;
}
extern "C"
{
    #include "file.h"
}
#include <iostream>

int main (void)
{
    std::cout << some() << std::endl;
}

Я получаю эту ошибку времени компиляции:

C4430: отсутствует указатель типа - предполагается int. Примечание: C ++ не поддерживает defualt-int.

Как с этим справиться?
Я использую MSVC2017 на MS-Windows10.

РЕДАКТИРОВАТЬ : я знаю, что большинство объявляют функциюс явным типом возврата, но я, что использовать USBPcap и USBPcap объявить некоторые функции, подобные этой. Как я могу использовать его в моей собственной программе на C ++?

Ответы [ 4 ]

4 голосов
/ 10 ноября 2019

extern "C" только изменяет связь объявлений. В частности, он отключает искажение имени в C ++, которое в противном случае необходимо для некоторых функций C ++, таких как перегрузка.

extern "C" не делает вложенную часть программы компилируемой как C. Таким образом, объявления должнывсе еще быть хорошо сформированным C ++. some (void) не является правильно сформированным объявлением в C ++, которое объясняет ошибку.

Как с этим справиться?

Объявите тип возвращаемого значения явно.

USBPcap объявляет некоторую функцию, подобную этой. Как я могу использовать его в моей собственной программе C ++?

Тогда вы не можете использовать этот заголовок. Вы можете написать совместимый с C ++ заголовок самостоятельно. Или вы можете использовать компилятор C ++, который поддерживает impilict int в качестве расширения.

PS Неявный int не является правильно сформированным в языке C с C99.

4 голосов
/ 10 ноября 2019

Все функции должны указывать тип возврата. Вы не указываете один для some.

В более старых версиях C, если вы опускаете возвращаемый тип функции, по умолчанию используется int. Однако C ++ не поддерживает это.

Вы всегда должны указывать тип возвращаемого значения функции:

int some(void)
{
    return 10;
}
2 голосов
/ 10 ноября 2019
  1. Не помещайте код в файлы .h, кроме статических встроенных функций
  2. Во-вторых, объявляйте функции правильно, а не ленивым способом. Что такое some(void)? Если компилятор C ++ знал тип возвращаемого значения функции ....
    extern "C"
    {
        int some (void)
        {
            return 10;
        }
    }
    #include <iostream>

    int main (void)
    {
        std::cout << some() << std::endl;
    }

https://godbolt.org/z/_AJgFX

0 голосов
/ 10 ноября 2019

Компилятор сказал вам точно, в чем проблема. Функция, которую вы пытаетесь вызвать из std::cout, должна иметь явно определенный возвращаемый тип. В Си компилятор автоматически устанавливает тип возвращаемого значения функции неопределенного типа на int, и вы можете скомпилировать код, который содержит нетипизированную функцию, без предупреждения компилятора, но не делать этого, это крайне неправильный способ написания кода,В C ++, как сказал вам компилятор, вы не можете, так что это ошибка. Определения в C и C ++ должны иметь тип , если вы хотите функцию, которая ничего не возвращает, вам нужно определить ее void. Однако в последних версиях стандартов c ++ вы можете использовать ключевое слово auto для автоматического определения типа объявления во время компиляции, поэтому, если вы хотите, чтобы компилятор автоматически определял тип чего-либо, используйте его, но используйте егоскупо. Итак, наконец, если вы хотите написать код на C или C ++, пожалуйста, добавьте тип к вашим определениям, это не python или javascript ...

...