doc: add clarification about C declarations (#9390)
parent
4d77f3810f
commit
c4e6ef424e
59
doc/docs.md
59
doc/docs.md
|
@ -3375,12 +3375,13 @@ NB: Each flag must go on its own line (for now)
|
||||||
#flag linux -DIMGUI_IMPL_API=
|
#flag linux -DIMGUI_IMPL_API=
|
||||||
```
|
```
|
||||||
|
|
||||||
In the console build command, you can use `-cflags` to pass custom flags to the backend C compiler.
|
In the console build command, you can use:
|
||||||
You can also use `-cc` to change the default C backend compiler.
|
* `-cflags` to pass custom flags to the backend C compiler.
|
||||||
For example: `-cc gcc-9 -cflags -fsanitize=thread`.
|
* `-cc` to change the default C backend compiler.
|
||||||
|
* For example: `-cc gcc-9 -cflags -fsanitize=thread`.
|
||||||
|
|
||||||
You can also define a `VFLAGS` environment variable in your terminal to store your `-cc`
|
You can define a `VFLAGS` environment variable in your terminal to store your `-cc`
|
||||||
and `cflags` settings, rather than including them in the build command each time.
|
and `-cflags` settings, rather than including them in the build command each time.
|
||||||
|
|
||||||
### #pkgconfig
|
### #pkgconfig
|
||||||
|
|
||||||
|
@ -3471,6 +3472,54 @@ To cast a `voidptr` to a V reference, use `user := &User(user_void_ptr)`.
|
||||||
|
|
||||||
[an example of a module that calls C code from V](https://github.com/vlang/v/blob/master/vlib/v/tests/project_with_c_code/mod1/wrapper.v)
|
[an example of a module that calls C code from V](https://github.com/vlang/v/blob/master/vlib/v/tests/project_with_c_code/mod1/wrapper.v)
|
||||||
|
|
||||||
|
### C Declarations
|
||||||
|
|
||||||
|
C identifiers are accessed with the `C` prefix similarly to how module-specific
|
||||||
|
identifiers are accessed. Functions must be redeclared in V before they can be used.
|
||||||
|
Any C types may be used behind the `C` prefix, but types must be redeclared in V in
|
||||||
|
order to access type members.
|
||||||
|
|
||||||
|
To redeclare complex types, such as in the following C code:
|
||||||
|
|
||||||
|
```c
|
||||||
|
struct SomeCStruct {
|
||||||
|
uint8_t implTraits;
|
||||||
|
uint16_t memPoolData;
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
void* data;
|
||||||
|
size_t size;
|
||||||
|
};
|
||||||
|
|
||||||
|
DataView view;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
members of sub-data-structures may be directly declared in the containing struct as below:
|
||||||
|
|
||||||
|
```v
|
||||||
|
struct C.SomeCStruct {
|
||||||
|
implTraits byte
|
||||||
|
memPoolData u16
|
||||||
|
// These members are part of sub data structures that can't currently be represented in V.
|
||||||
|
// Declaring them directly like this is sufficient for access.
|
||||||
|
// union {
|
||||||
|
// struct {
|
||||||
|
data voidptr
|
||||||
|
size size_t
|
||||||
|
// }
|
||||||
|
view C.DataView
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
The existence of the data members is made known to V, and they may be used without
|
||||||
|
re-creating the original structure exactly.
|
||||||
|
|
||||||
|
Alternatively, you may [embed](#embedded-structs) the sub-data-structures to maintain
|
||||||
|
a parallel code structure.
|
||||||
|
|
||||||
## Debugging generated C code
|
## Debugging generated C code
|
||||||
|
|
||||||
To debug issues in the generated C code, you can pass these flags:
|
To debug issues in the generated C code, you can pass these flags:
|
||||||
|
|
Loading…
Reference in New Issue