나는 C++ 11에서 소개 된 lambdas의 간결한 구문으로부터 큰 이점을 얻을 수있는 코드를 작성 중이다. 이것은 컴파일러가 지원합니까?MSP430 GCC는 최신 C++ 표준을 지원합니까? (11, 14, 17)
Energia 또는 embedXcode를 사용하여 컴파일 할 때 컴파일러 플래그를 어떻게 지정합니까?
나는 C++ 11에서 소개 된 lambdas의 간결한 구문으로부터 큰 이점을 얻을 수있는 코드를 작성 중이다. 이것은 컴파일러가 지원합니까?MSP430 GCC는 최신 C++ 표준을 지원합니까? (11, 14, 17)
Energia 또는 embedXcode를 사용하여 컴파일 할 때 컴파일러 플래그를 어떻게 지정합니까?
TI 사이트에서이 주제에 관해 많이 알지 못하거나, 최소한, 자세하고 정확한 응답을주기에는 충분하지 않습니다.
임베디드 ABI의 구현은 주로 Itanium C++ ABI의 파생어 인 this document에 설명되어 있습니다. 람다 구현이나 auto
키워드에 대해서는 아무 것도 설명하지 않습니다. (또는 아마이 정보를 문서에서 얻을 수 없습니다.)
따라서 Energia에서 직접 시험으로 결정했습니다. 분명히 g++
버전은 4.6.3이므로 두 버전을 모두 지원해야합니다.
// In template.hpp
#ifndef TEMPLATE_HPP_
#define TEMPLATE_HPP_
template<class T>
T func(T a) {
auto c = [&](int n) { return n + a; };
return c(0);
}
#endif /* TEMPLATE_HPP_ */
// in the sketch main
#include "template.hpp"
void setup() { int b = func<int>(0); }
void loop() { }
(템플릿에만 헤더의 경우 작동합니다
그리고 사실
처럼 뭔가를 컴파일 할 수 있습니다 (보기의 편집 지점에서, 나는 코드를 테스트하기 위해 여기 내 MSP가 없습니다) , 메인 스케치에서 오류가 발생합니다). 이 스케치를 컴파일하기 위해 에디터의 하나의 내부 파일을 수정해야했습니다. 최대 지원 기준은-std=c++0x
것 같다 및 컴파일 플래그는 파일에 내 설정에서
$ENERGIA_ROOT/hardware/energia/msp430/platform.txt
루트 /opt/energia
입니다. 그 파일 안에는 32
(compiler.cpp.flags
) 줄을 수정하고 옵션을 추가했습니다. -std=c++11
은 지원되지 않습니다 (오류 발생).
compiler.cpp.flags=-std=c++0x -c -g -O2 {compiler.mlarge_flag} {compiler.warning_flags} -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD
불행하게도 나는 그래서 당신이 그것을 모방 클래스의 어떤 종류를 작성해야, 제공되지 embedXcode
:\
모방 std::function
std::function
제로 경험이 있습니다. 뭔가 같은 :
// callback.hpp
#ifndef CALLBACK_HPP_
#define CALLBACK_HPP_
template <class RET, class ARG>
class Callback {
RET (*_f)(ARG);
public:
Callback() : _f(0) { };
Callback(RET (*f)(ARG)) : _f(f) { };
bool is_set() const { return (_f) ? true : false; }
RET operator()(ARG a) const { return is_set() ? _f(a) : 0; }
};
#endif /* CALLBACK_HPP_ */
// sketch
#include "callback.hpp"
// | !! empty capture!
void setup() { // V
auto clb = Callback<int, char>([](char c) { return (int)c; });
if (clb.is_set())
auto b = clb('a');
}
void loop() {}
이 작업을 할 수 있으며,이 간단한 트릭을 사용
없는 람다 캡처 람다 표현 닫는 방법의 종류는 공공 가상이 아닌 비를 가지고 -explicit const 변환 함수 이 동일한 매개 변수를 갖는 함수에 대한 포인터와 클로저 유형의 함수 호출 연산자와 같은 반환 유형을가집니다. [C++ 11 표준 5.1.2]
캡처를 비워두면 함수 포인터로 "변환"할 수 있으므로 문제없이 저장할 수 있습니다.내가 작성한 코드 :
ARG
을 필요로하는 첫 번째 템플릿 RET
이 필요합니다. 대부분의 경우 void*
을 공용 인수로 사용할 수 있습니다 (void 포인터에서 구조체 포인터를 캐스팅하여 인수로 사용하여 함수에서 카운터 캐스팅을 수행하면 아무런 비용도 들지 않습니다)NULL
으로 함수 포인터를 초기화하고 두 번째는 직접 콜백을 할당합니다. 복사 생성자가 누락되었으므로이를 구현해야합니다.()
) 메소드를 구현하고 콜백이 실제로 존재하는지 확인합니다.는 다시 : 이 물건은 경고없이 컴파일하지만 그것은 MSP430에 작동하는 경우에 나는 그것을 테스트 할 수 있기 때문에 내가 (그것이 일반적인 AMD64 리눅스 시스템에서 작동), 모르겠어요.
하 나는'-std = C++ 0x'에 관한 부분을 알아내는 것을 끝내었지만 당신 앞에 답을 게시 할 기회를 얻지 못했습니다. 나는 실제로 반원으로서 람다를 저장할 수 있다는 이점을 얻을 수있는 상황에 처하게되었습니다. std :: function (어떻게 stl이 없기 때문에)없이 이것을 어떻게 할 수 있습니까? – Alexander
자신의 클래스로'std :: function'을 모방 한 것일까 요? (답 참조) –