>

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

    C에서 아주 적은 것은 불법이며, 이는 당신이 할 수 없다는 것을 의미합니다. 오히려 많은 것들이 C 표준에 의해 정의되지 않습니다. 즉, C 표준은 C 표준에 따라 어떤 일이 일어날 지 말하지 않습니다. 명명 된 멤버가없는 구조는 이런 것입니다.

    C 2018 6.7.2.1 8은 부분적으로 다음과 같이 말합니다 :

    와이즈 비즈

    "알 수없는 유형"으로 사용할 무언가가 필요하고

    If the struct-declaration-list does not contain any named members, either directly or via an anonymous structure or anonymous union, the behavior is undefined.

    를 사용하고 싶지 않은 경우 다음과 같이 태그는 알려져 있지만 내용은없는 구조를 선언 할 수 있습니다.

    void
    
    

    그런 다음 이러한 구조에 대한 포인터를 사용할 수 있습니다 (예 : 포인터 struct foo; 를 정의 할 수 있음) )하지만 컴파일러는 이러한 구조의 크기 또는 내용을 알지 못하므로 포인터를 전달하고 외부 루틴 (내용에 대해 알고있는)을 요청하는 것 외에는 할당하거나 배열을 관리하거나 다른 방법으로 사용할 수 없습니다 ).

    일반적으로 한 모듈의 C 루틴과 다른 모듈의 C 루틴 간 작업에서 :

    구조의 내용을 모르는 한 소스 모듈에서 포인터 ( struct foo *p; ).

    다른 소스 모듈 (종종 소프트웨어 라이브러리)은 구조의 내용에 대해 알고있을 것입니다. 자체 소스 코드 내에서 struct foo * 를 사용하여 전체 구조를 정의합니다. 첫 번째 모듈에 대해이 구조에서 서비스를 수행합니다.

    이러한 두 C 모듈 사이에서 C 표준의 규칙이 동작을 정의합니다.

    C와 Ada 사이의 인터페이스이므로 C와 Ada 구현에서 이러한 상호 작용 규칙을 제공해야합니다.

  • 답변 # 2

    Ada 바인딩을 C 라이브러리에 작성하는 관점에서, struct foo { /* various things */ }; 에 사용할 Ada Convention-C 액세스 유형은 중요하지 않습니다.  지정합니다. 가져온 C 함수에 전달하는 것을 제외하고는 유형의 객체로 아무것도 수행하지 않을 것입니다. 나는 보통

    void*
    
    

    type Void_Ptr is access all Integer; pragma Convention (C, Void_Ptr);

  • 이전 java - Spring 싱글 톤 Bean에서 개인 메소드를 정적으로 만드는 이유가 있습니까?
  • 다음 javascript - 한 문자열이 다른 문자열로 끝나는 경우 문자열 조작