홈>
http://c0x.coding-guidelines.com/6.7.2.1.html :
1401 If the struct-declaration-list contains no named members, the behavior is undefined.
이것은 다음이 불법이라는 것을 의미합니까?
struct C { };
무엇을 의미합니까?
나는
Convention=>C
를 사용했다
빈 구조체에 대한 Ada 포인터 (사실 빈 Ada 레코드) 대신
void*
를 제공합니다.
C 라이브러리의 바인딩에서 (
void*
가 없기 때문에
에이다). 이것이 잘못되었는지 궁금합니다.
무엇을 오해합니까?
<시간> "p가 0이 아닌 필드를 가진 구조체를 extern (C) 함수로 전달하거나 반환하지 마십시오. C11 6.7.2.1p8에 따르면 이것은 정의되지 않은 동작입니다." https://dlang.org/spec/struct.html- 답변 # 1
- 답변 # 2
Ada 바인딩을 C 라이브러리에 작성하는 관점에서,
struct foo { /* various things */ };
에 사용할 Ada Convention-C 액세스 유형은 중요하지 않습니다. 지정합니다. 가져온 C 함수에 전달하는 것을 제외하고는 유형의 객체로 아무것도 수행하지 않을 것입니다. 나는 보통void*
type Void_Ptr is access all Integer; pragma Convention (C, Void_Ptr);
관련 질문
- C에서 구조체와 공용체를 사용하여 비트 연산을 수행하는 방법은 무엇입니까?
- c : 구조체 유형인 배열의 요소 선언
- arrays : 구조체 배열을 통해 반복할 때 잘못된 값이 인쇄됨
- arrays : 구조체 내부에 선언된 배열을 초기화하는 방법은 무엇입니까?
- c : 구조체 변수에서 여러 문자 변수를 공백으로 구분된 값과 결합하는 방법은 무엇입니까?
- C: typedef 없이 구조체의 배열을 사용할 때 "배열 유형에 불완전한 요소 유형이 있습니다"
- arrays : C에서 구조체 배열에 대한 메모리를 재할당하는 방법은 무엇입니까?
- C++ 'extern "C" __declspec(dllexport)' 구조체를 Rust로 변환하는 데 문제가 있습니다.
- c : 연결 목록에서 요소 교환
- python : 파이썬에서 배열 멤버로 C 구조체를 읽는 방법
C에서 아주 적은 것은 불법이며, 이는 당신이 할 수 없다는 것을 의미합니다. 오히려 많은 것들이 C 표준에 의해 정의되지 않습니다. 즉, C 표준은 C 표준에 따라 어떤 일이 일어날 지 말하지 않습니다. 명명 된 멤버가없는 구조는 이런 것입니다.
C 2018 6.7.2.1 8은 부분적으로 다음과 같이 말합니다 :
와이즈 비즈"알 수없는 유형"으로 사용할 무언가가 필요하고
를 사용하고 싶지 않은 경우 다음과 같이 태그는 알려져 있지만 내용은없는 구조를 선언 할 수 있습니다. 그런 다음 이러한 구조에 대한 포인터를 사용할 수 있습니다 (예 : 포인터struct foo;
를 정의 할 수 있음) )하지만 컴파일러는 이러한 구조의 크기 또는 내용을 알지 못하므로 포인터를 전달하고 외부 루틴 (내용에 대해 알고있는)을 요청하는 것 외에는 할당하거나 배열을 관리하거나 다른 방법으로 사용할 수 없습니다 ).일반적으로 한 모듈의 C 루틴과 다른 모듈의 C 루틴 간 작업에서 :
구조의 내용을 모르는 한 소스 모듈에서 포인터 (
다른 소스 모듈 (종종 소프트웨어 라이브러리)은 구조의 내용에 대해 알고있을 것입니다. 자체 소스 코드 내에서struct foo *p;
).struct foo *
를 사용하여 전체 구조를 정의합니다. 첫 번째 모듈에 대해이 구조에서 서비스를 수행합니다.이러한 두 C 모듈 사이에서 C 표준의 규칙이 동작을 정의합니다.
C와 Ada 사이의 인터페이스이므로 C와 Ada 구현에서 이러한 상호 작용 규칙을 제공해야합니다.