IAR неправильно компилирует файл C ++ с включенной опцией Auto (на основе расширений) - PullRequest
0 голосов
/ 01 октября 2019

Это может быть немного длинным выстрелом ...

У меня есть проект C и я хочу включить файл C ++, однако я получаю сообщение об ошибке со следующим кодом:

//GPIO_CPP.cpp

class GPIO
{
    public:
        uint32_t Port;
        uint32_t Pin;
};

#ifndef __cplusplus
    #error  Enable CPP compilation
#endif

Это включено в мой main.c следующим образом:

//main.c

#include "GPIO_CPP.cpp"

Ошибка:

Error[Pe020]: identifier "class" is undefined

Я также попытался поместить это в файл заголовка с расширениями .h и .hppс тем же поведением.

Я поместил проверку компилятора:

#ifndef __cplusplus
    #error  Enable CPP compilation
#endif

, которая запускает.

Мои параметры компилятора:

Image of compiler setting

1 Ответ

1 голос
/ 03 октября 2019

Если вы пытаетесь включить модуль C ++ в проект C, лучший способ сделать это:

gpio.h

#ifndef GPIO_H
#define GPIO_H

// Types accessible to C and C++ modules

struct GPIO
{
    uint32_t Port;
    uint32_t Pin;
};

// Functions accessible to C and C++ modules.
// Use extern "C" only when included to C++ file.
#ifdef __cplusplus
extern "C" {
#endif
void foo(uint32_t x);
#ifdef __cplusplus
}
#endif

// Functions accessible to C++ modules only.
// These functions not visible if included to C file.
#ifdef __cplusplus
void bar(uint32_t x);
#endif

#endif

gpio.cpp

#include "gpio.h"

// extern "C" declaration must be visible to this definition to compile with C compatible signature
void foo(uint32_t x) {
    // It's OK to call C++ functions from C compatible functions, 
    // because this is C++ compilation unit.
    bar(x);
}

// This function can be called only from C++ modules
void bar(uint32_t x) {
    // It's OK to call C compatible functions from C++ functions
    foo(x);
}

main.c

#include "gpio.h"

// Use only C compatible types (struct GPIO) and functions (foo) here
int main(void) {
    foo(1); // ok, because of extern "C"
    bar(1); // invalid because this is C file
}

Добавьте main.c и gpio.cpp в дерево проекта и убедитесь, что языкнастройка установлена ​​на Auto.

...