Multiple definition of function in the same place
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ height:90px;width:728px;box-sizing:border-box;
}
I am trying to simulate generics in C by having some preprocessor definitions for a matrix
type. Here is an excerpt of that:
#define __matrix_struct(TYPE)
struct {
uint32_t sz;
TYPE **ptr;
}
#define __matrix_t(TYPE) matrix_ ## TYPE
#define __matrix_ptr_t(TYPE) __matrix_t(TYPE) *
#define __matrix_typedef(TYPE) typedef __matrix_struct(TYPE) __matrix_t(TYPE)
#define __matrix_allocator_name(TYPE) TYPE ## _matrix_alloc
#define __matrix_allocator(TYPE)
__matrix_ptr_t(TYPE) __matrix_allocator_name(TYPE) (uint32_t sz) {
uint32_t i;
__matrix_ptr_t(TYPE) m = (__matrix_ptr_t(TYPE)) malloc(sizeof(__matrix_t(TYPE)));
m->ptr = (TYPE **) malloc(sz * sizeof(TYPE *));
for (i = 0; i < sz; ++i) {
m->ptr[i] = (TYPE *) calloc(sz, sizeof(TYPE));
}
return m;
}
#define __matrix_deallocator_name(TYPE) TYPE ## _matrix_free
#define __matrix_deallocator(TYPE)
void __matrix_deallocator_name(TYPE) (__matrix_ptr_t(TYPE) m) {
uint32_t i;
for (i = 0; i < m->sz; i++) {
free(m->ptr[i]);
}
free(m->ptr);
free(m);
}
#define matrix_alloc_ptr(TYPE, SIZE) __matrix_allocator_name(TYPE) (SIZE)
#define matrix_dealloc_ptr(TYPE, PTR_NAME) __matrix_deallocator_name(TYPE) (PTR_NAME)
In another file, byte_matrix.h
, I am trying to define a matrix of uint8_t
values, as follows:
#include "matrix.h"
typedef uint8_t byte;
__matrix_typedef(byte);
__matrix_allocator(byte)
__matrix_deallocator(byte)
When I try to compile, I get the following errors:
CMakeFiles/tictac.dir/game/board.c.o: In function `byte_matrix_alloc':
/home/victor/dev/pc/tictac/game/../matrix/byte_matrix.h:13: multiple definition of `byte_matrix_alloc'
CMakeFiles/tictac.dir/main.c.o:/home/victor/dev/pc/tictac/game/../matrix/byte_matrix.h:13: first defined here
CMakeFiles/tictac.dir/game/board.c.o: In function `byte_matrix_free':
/home/victor/dev/pc/tictac/game/../matrix/byte_matrix.h:14: multiple definition of `byte_matrix_free'
CMakeFiles/tictac.dir/main.c.o:/home/victor/dev/pc/tictac/game/../matrix/byte_matrix.h:14: first defined here
I cannot understand why it would point to times to the same line and complain about that definition, since every header I wrote has include guards. Could you please explain this to me? Also if you know of a better approach to my problem, please let me know. Thanks.
Also I need to compile with -std=c99
if that matters in this case.
c c99 generic-programming
|
show 6 more comments
I am trying to simulate generics in C by having some preprocessor definitions for a matrix
type. Here is an excerpt of that:
#define __matrix_struct(TYPE)
struct {
uint32_t sz;
TYPE **ptr;
}
#define __matrix_t(TYPE) matrix_ ## TYPE
#define __matrix_ptr_t(TYPE) __matrix_t(TYPE) *
#define __matrix_typedef(TYPE) typedef __matrix_struct(TYPE) __matrix_t(TYPE)
#define __matrix_allocator_name(TYPE) TYPE ## _matrix_alloc
#define __matrix_allocator(TYPE)
__matrix_ptr_t(TYPE) __matrix_allocator_name(TYPE) (uint32_t sz) {
uint32_t i;
__matrix_ptr_t(TYPE) m = (__matrix_ptr_t(TYPE)) malloc(sizeof(__matrix_t(TYPE)));
m->ptr = (TYPE **) malloc(sz * sizeof(TYPE *));
for (i = 0; i < sz; ++i) {
m->ptr[i] = (TYPE *) calloc(sz, sizeof(TYPE));
}
return m;
}
#define __matrix_deallocator_name(TYPE) TYPE ## _matrix_free
#define __matrix_deallocator(TYPE)
void __matrix_deallocator_name(TYPE) (__matrix_ptr_t(TYPE) m) {
uint32_t i;
for (i = 0; i < m->sz; i++) {
free(m->ptr[i]);
}
free(m->ptr);
free(m);
}
#define matrix_alloc_ptr(TYPE, SIZE) __matrix_allocator_name(TYPE) (SIZE)
#define matrix_dealloc_ptr(TYPE, PTR_NAME) __matrix_deallocator_name(TYPE) (PTR_NAME)
In another file, byte_matrix.h
, I am trying to define a matrix of uint8_t
values, as follows:
#include "matrix.h"
typedef uint8_t byte;
__matrix_typedef(byte);
__matrix_allocator(byte)
__matrix_deallocator(byte)
When I try to compile, I get the following errors:
CMakeFiles/tictac.dir/game/board.c.o: In function `byte_matrix_alloc':
/home/victor/dev/pc/tictac/game/../matrix/byte_matrix.h:13: multiple definition of `byte_matrix_alloc'
CMakeFiles/tictac.dir/main.c.o:/home/victor/dev/pc/tictac/game/../matrix/byte_matrix.h:13: first defined here
CMakeFiles/tictac.dir/game/board.c.o: In function `byte_matrix_free':
/home/victor/dev/pc/tictac/game/../matrix/byte_matrix.h:14: multiple definition of `byte_matrix_free'
CMakeFiles/tictac.dir/main.c.o:/home/victor/dev/pc/tictac/game/../matrix/byte_matrix.h:14: first defined here
I cannot understand why it would point to times to the same line and complain about that definition, since every header I wrote has include guards. Could you please explain this to me? Also if you know of a better approach to my problem, please let me know. Thanks.
Also I need to compile with -std=c99
if that matters in this case.
c c99 generic-programming
1
Did you try to run only the preprocessor?
– Amessihel
Nov 16 '18 at 10:31
2
You are includingbyte_matrix.h
in multiple compilation units, which means you get multiple function definitions. You need to make these functionsstatic
.
– Groo
Nov 16 '18 at 10:35
1
You can use two macros --__matrix_allocator_declare
for h-files and__matrix_allocator_define
for one (selected by you) c-file.
– ReAl
Nov 16 '18 at 10:36
2
If you don't usestatic
, functions are by defaultextern
. This means that you will have multiple functions namedbyte_matrix_alloc
in your program. If you usestatic
, then you are saying that this function is private to each compilation unit, i.e. each .c file gets it's own copy of the function.
– Groo
Nov 16 '18 at 10:38
2
Interesting, C11 (C99 successor) provides type-generic expressions.
– Amessihel
Nov 16 '18 at 10:45
|
show 6 more comments
I am trying to simulate generics in C by having some preprocessor definitions for a matrix
type. Here is an excerpt of that:
#define __matrix_struct(TYPE)
struct {
uint32_t sz;
TYPE **ptr;
}
#define __matrix_t(TYPE) matrix_ ## TYPE
#define __matrix_ptr_t(TYPE) __matrix_t(TYPE) *
#define __matrix_typedef(TYPE) typedef __matrix_struct(TYPE) __matrix_t(TYPE)
#define __matrix_allocator_name(TYPE) TYPE ## _matrix_alloc
#define __matrix_allocator(TYPE)
__matrix_ptr_t(TYPE) __matrix_allocator_name(TYPE) (uint32_t sz) {
uint32_t i;
__matrix_ptr_t(TYPE) m = (__matrix_ptr_t(TYPE)) malloc(sizeof(__matrix_t(TYPE)));
m->ptr = (TYPE **) malloc(sz * sizeof(TYPE *));
for (i = 0; i < sz; ++i) {
m->ptr[i] = (TYPE *) calloc(sz, sizeof(TYPE));
}
return m;
}
#define __matrix_deallocator_name(TYPE) TYPE ## _matrix_free
#define __matrix_deallocator(TYPE)
void __matrix_deallocator_name(TYPE) (__matrix_ptr_t(TYPE) m) {
uint32_t i;
for (i = 0; i < m->sz; i++) {
free(m->ptr[i]);
}
free(m->ptr);
free(m);
}
#define matrix_alloc_ptr(TYPE, SIZE) __matrix_allocator_name(TYPE) (SIZE)
#define matrix_dealloc_ptr(TYPE, PTR_NAME) __matrix_deallocator_name(TYPE) (PTR_NAME)
In another file, byte_matrix.h
, I am trying to define a matrix of uint8_t
values, as follows:
#include "matrix.h"
typedef uint8_t byte;
__matrix_typedef(byte);
__matrix_allocator(byte)
__matrix_deallocator(byte)
When I try to compile, I get the following errors:
CMakeFiles/tictac.dir/game/board.c.o: In function `byte_matrix_alloc':
/home/victor/dev/pc/tictac/game/../matrix/byte_matrix.h:13: multiple definition of `byte_matrix_alloc'
CMakeFiles/tictac.dir/main.c.o:/home/victor/dev/pc/tictac/game/../matrix/byte_matrix.h:13: first defined here
CMakeFiles/tictac.dir/game/board.c.o: In function `byte_matrix_free':
/home/victor/dev/pc/tictac/game/../matrix/byte_matrix.h:14: multiple definition of `byte_matrix_free'
CMakeFiles/tictac.dir/main.c.o:/home/victor/dev/pc/tictac/game/../matrix/byte_matrix.h:14: first defined here
I cannot understand why it would point to times to the same line and complain about that definition, since every header I wrote has include guards. Could you please explain this to me? Also if you know of a better approach to my problem, please let me know. Thanks.
Also I need to compile with -std=c99
if that matters in this case.
c c99 generic-programming
I am trying to simulate generics in C by having some preprocessor definitions for a matrix
type. Here is an excerpt of that:
#define __matrix_struct(TYPE)
struct {
uint32_t sz;
TYPE **ptr;
}
#define __matrix_t(TYPE) matrix_ ## TYPE
#define __matrix_ptr_t(TYPE) __matrix_t(TYPE) *
#define __matrix_typedef(TYPE) typedef __matrix_struct(TYPE) __matrix_t(TYPE)
#define __matrix_allocator_name(TYPE) TYPE ## _matrix_alloc
#define __matrix_allocator(TYPE)
__matrix_ptr_t(TYPE) __matrix_allocator_name(TYPE) (uint32_t sz) {
uint32_t i;
__matrix_ptr_t(TYPE) m = (__matrix_ptr_t(TYPE)) malloc(sizeof(__matrix_t(TYPE)));
m->ptr = (TYPE **) malloc(sz * sizeof(TYPE *));
for (i = 0; i < sz; ++i) {
m->ptr[i] = (TYPE *) calloc(sz, sizeof(TYPE));
}
return m;
}
#define __matrix_deallocator_name(TYPE) TYPE ## _matrix_free
#define __matrix_deallocator(TYPE)
void __matrix_deallocator_name(TYPE) (__matrix_ptr_t(TYPE) m) {
uint32_t i;
for (i = 0; i < m->sz; i++) {
free(m->ptr[i]);
}
free(m->ptr);
free(m);
}
#define matrix_alloc_ptr(TYPE, SIZE) __matrix_allocator_name(TYPE) (SIZE)
#define matrix_dealloc_ptr(TYPE, PTR_NAME) __matrix_deallocator_name(TYPE) (PTR_NAME)
In another file, byte_matrix.h
, I am trying to define a matrix of uint8_t
values, as follows:
#include "matrix.h"
typedef uint8_t byte;
__matrix_typedef(byte);
__matrix_allocator(byte)
__matrix_deallocator(byte)
When I try to compile, I get the following errors:
CMakeFiles/tictac.dir/game/board.c.o: In function `byte_matrix_alloc':
/home/victor/dev/pc/tictac/game/../matrix/byte_matrix.h:13: multiple definition of `byte_matrix_alloc'
CMakeFiles/tictac.dir/main.c.o:/home/victor/dev/pc/tictac/game/../matrix/byte_matrix.h:13: first defined here
CMakeFiles/tictac.dir/game/board.c.o: In function `byte_matrix_free':
/home/victor/dev/pc/tictac/game/../matrix/byte_matrix.h:14: multiple definition of `byte_matrix_free'
CMakeFiles/tictac.dir/main.c.o:/home/victor/dev/pc/tictac/game/../matrix/byte_matrix.h:14: first defined here
I cannot understand why it would point to times to the same line and complain about that definition, since every header I wrote has include guards. Could you please explain this to me? Also if you know of a better approach to my problem, please let me know. Thanks.
Also I need to compile with -std=c99
if that matters in this case.
c c99 generic-programming
c c99 generic-programming
edited Nov 16 '18 at 13:07
Amessihel
2,6991826
2,6991826
asked Nov 16 '18 at 10:24
VictorVictor
5,5941246105
5,5941246105
1
Did you try to run only the preprocessor?
– Amessihel
Nov 16 '18 at 10:31
2
You are includingbyte_matrix.h
in multiple compilation units, which means you get multiple function definitions. You need to make these functionsstatic
.
– Groo
Nov 16 '18 at 10:35
1
You can use two macros --__matrix_allocator_declare
for h-files and__matrix_allocator_define
for one (selected by you) c-file.
– ReAl
Nov 16 '18 at 10:36
2
If you don't usestatic
, functions are by defaultextern
. This means that you will have multiple functions namedbyte_matrix_alloc
in your program. If you usestatic
, then you are saying that this function is private to each compilation unit, i.e. each .c file gets it's own copy of the function.
– Groo
Nov 16 '18 at 10:38
2
Interesting, C11 (C99 successor) provides type-generic expressions.
– Amessihel
Nov 16 '18 at 10:45
|
show 6 more comments
1
Did you try to run only the preprocessor?
– Amessihel
Nov 16 '18 at 10:31
2
You are includingbyte_matrix.h
in multiple compilation units, which means you get multiple function definitions. You need to make these functionsstatic
.
– Groo
Nov 16 '18 at 10:35
1
You can use two macros --__matrix_allocator_declare
for h-files and__matrix_allocator_define
for one (selected by you) c-file.
– ReAl
Nov 16 '18 at 10:36
2
If you don't usestatic
, functions are by defaultextern
. This means that you will have multiple functions namedbyte_matrix_alloc
in your program. If you usestatic
, then you are saying that this function is private to each compilation unit, i.e. each .c file gets it's own copy of the function.
– Groo
Nov 16 '18 at 10:38
2
Interesting, C11 (C99 successor) provides type-generic expressions.
– Amessihel
Nov 16 '18 at 10:45
1
1
Did you try to run only the preprocessor?
– Amessihel
Nov 16 '18 at 10:31
Did you try to run only the preprocessor?
– Amessihel
Nov 16 '18 at 10:31
2
2
You are including
byte_matrix.h
in multiple compilation units, which means you get multiple function definitions. You need to make these functions static
.– Groo
Nov 16 '18 at 10:35
You are including
byte_matrix.h
in multiple compilation units, which means you get multiple function definitions. You need to make these functions static
.– Groo
Nov 16 '18 at 10:35
1
1
You can use two macros --
__matrix_allocator_declare
for h-files and __matrix_allocator_define
for one (selected by you) c-file.– ReAl
Nov 16 '18 at 10:36
You can use two macros --
__matrix_allocator_declare
for h-files and __matrix_allocator_define
for one (selected by you) c-file.– ReAl
Nov 16 '18 at 10:36
2
2
If you don't use
static
, functions are by default extern
. This means that you will have multiple functions named byte_matrix_alloc
in your program. If you use static
, then you are saying that this function is private to each compilation unit, i.e. each .c file gets it's own copy of the function.– Groo
Nov 16 '18 at 10:38
If you don't use
static
, functions are by default extern
. This means that you will have multiple functions named byte_matrix_alloc
in your program. If you use static
, then you are saying that this function is private to each compilation unit, i.e. each .c file gets it's own copy of the function.– Groo
Nov 16 '18 at 10:38
2
2
Interesting, C11 (C99 successor) provides type-generic expressions.
– Amessihel
Nov 16 '18 at 10:45
Interesting, C11 (C99 successor) provides type-generic expressions.
– Amessihel
Nov 16 '18 at 10:45
|
show 6 more comments
2 Answers
2
active
oldest
votes
A quick fix would be to add static
to your function definitions. This will create a static copy of these functions in each compilation unit which references the header. If you want the functions to be inlined every time, this is the way to go.
An alternative way to do it would be to keep function declarations in a .h file, and actual definitions in a single .c file. This approach will avoid duplication, and the compiler will not inline them (unless your linker supports link time optimization).
The reason is that you are including this header file in multiple compilation units. After the preprocessor does all the textual replacements, you end up with actual separate function definitions inside your .c files. And if you don't specify that you want them to be static
, they are by default extern
, which means that now the compiler doesn't know how to differentiate them if some other part of the code wants to call them.
This is what you basically do whenever you create a header file: you create a list of declarations which will be included in many compilation units, but there is always a single extern definition in a single .c file.
add a comment |
Another way (relative to the proposed by Groo) is to create two macros.
__matrix_allocator_declare
with just prototype of function -- for h-file(s)
__matrix_allocator_define
with function body -- for one (selected by you) c-file
This way requires to handle two macros and to not forget add function-body macro in some file, but (and it is more important for embedded applications on small microcontrollers) it guarantees that only one function instance will consume memory.
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53335887%2fmultiple-definition-of-function-in-the-same-place%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
A quick fix would be to add static
to your function definitions. This will create a static copy of these functions in each compilation unit which references the header. If you want the functions to be inlined every time, this is the way to go.
An alternative way to do it would be to keep function declarations in a .h file, and actual definitions in a single .c file. This approach will avoid duplication, and the compiler will not inline them (unless your linker supports link time optimization).
The reason is that you are including this header file in multiple compilation units. After the preprocessor does all the textual replacements, you end up with actual separate function definitions inside your .c files. And if you don't specify that you want them to be static
, they are by default extern
, which means that now the compiler doesn't know how to differentiate them if some other part of the code wants to call them.
This is what you basically do whenever you create a header file: you create a list of declarations which will be included in many compilation units, but there is always a single extern definition in a single .c file.
add a comment |
A quick fix would be to add static
to your function definitions. This will create a static copy of these functions in each compilation unit which references the header. If you want the functions to be inlined every time, this is the way to go.
An alternative way to do it would be to keep function declarations in a .h file, and actual definitions in a single .c file. This approach will avoid duplication, and the compiler will not inline them (unless your linker supports link time optimization).
The reason is that you are including this header file in multiple compilation units. After the preprocessor does all the textual replacements, you end up with actual separate function definitions inside your .c files. And if you don't specify that you want them to be static
, they are by default extern
, which means that now the compiler doesn't know how to differentiate them if some other part of the code wants to call them.
This is what you basically do whenever you create a header file: you create a list of declarations which will be included in many compilation units, but there is always a single extern definition in a single .c file.
add a comment |
A quick fix would be to add static
to your function definitions. This will create a static copy of these functions in each compilation unit which references the header. If you want the functions to be inlined every time, this is the way to go.
An alternative way to do it would be to keep function declarations in a .h file, and actual definitions in a single .c file. This approach will avoid duplication, and the compiler will not inline them (unless your linker supports link time optimization).
The reason is that you are including this header file in multiple compilation units. After the preprocessor does all the textual replacements, you end up with actual separate function definitions inside your .c files. And if you don't specify that you want them to be static
, they are by default extern
, which means that now the compiler doesn't know how to differentiate them if some other part of the code wants to call them.
This is what you basically do whenever you create a header file: you create a list of declarations which will be included in many compilation units, but there is always a single extern definition in a single .c file.
A quick fix would be to add static
to your function definitions. This will create a static copy of these functions in each compilation unit which references the header. If you want the functions to be inlined every time, this is the way to go.
An alternative way to do it would be to keep function declarations in a .h file, and actual definitions in a single .c file. This approach will avoid duplication, and the compiler will not inline them (unless your linker supports link time optimization).
The reason is that you are including this header file in multiple compilation units. After the preprocessor does all the textual replacements, you end up with actual separate function definitions inside your .c files. And if you don't specify that you want them to be static
, they are by default extern
, which means that now the compiler doesn't know how to differentiate them if some other part of the code wants to call them.
This is what you basically do whenever you create a header file: you create a list of declarations which will be included in many compilation units, but there is always a single extern definition in a single .c file.
answered Nov 16 '18 at 10:42
GrooGroo
36k1490160
36k1490160
add a comment |
add a comment |
Another way (relative to the proposed by Groo) is to create two macros.
__matrix_allocator_declare
with just prototype of function -- for h-file(s)
__matrix_allocator_define
with function body -- for one (selected by you) c-file
This way requires to handle two macros and to not forget add function-body macro in some file, but (and it is more important for embedded applications on small microcontrollers) it guarantees that only one function instance will consume memory.
add a comment |
Another way (relative to the proposed by Groo) is to create two macros.
__matrix_allocator_declare
with just prototype of function -- for h-file(s)
__matrix_allocator_define
with function body -- for one (selected by you) c-file
This way requires to handle two macros and to not forget add function-body macro in some file, but (and it is more important for embedded applications on small microcontrollers) it guarantees that only one function instance will consume memory.
add a comment |
Another way (relative to the proposed by Groo) is to create two macros.
__matrix_allocator_declare
with just prototype of function -- for h-file(s)
__matrix_allocator_define
with function body -- for one (selected by you) c-file
This way requires to handle two macros and to not forget add function-body macro in some file, but (and it is more important for embedded applications on small microcontrollers) it guarantees that only one function instance will consume memory.
Another way (relative to the proposed by Groo) is to create two macros.
__matrix_allocator_declare
with just prototype of function -- for h-file(s)
__matrix_allocator_define
with function body -- for one (selected by you) c-file
This way requires to handle two macros and to not forget add function-body macro in some file, but (and it is more important for embedded applications on small microcontrollers) it guarantees that only one function instance will consume memory.
answered Nov 16 '18 at 10:58
ReAlReAl
8001317
8001317
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53335887%2fmultiple-definition-of-function-in-the-same-place%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
1
Did you try to run only the preprocessor?
– Amessihel
Nov 16 '18 at 10:31
2
You are including
byte_matrix.h
in multiple compilation units, which means you get multiple function definitions. You need to make these functionsstatic
.– Groo
Nov 16 '18 at 10:35
1
You can use two macros --
__matrix_allocator_declare
for h-files and__matrix_allocator_define
for one (selected by you) c-file.– ReAl
Nov 16 '18 at 10:36
2
If you don't use
static
, functions are by defaultextern
. This means that you will have multiple functions namedbyte_matrix_alloc
in your program. If you usestatic
, then you are saying that this function is private to each compilation unit, i.e. each .c file gets it's own copy of the function.– Groo
Nov 16 '18 at 10:38
2
Interesting, C11 (C99 successor) provides type-generic expressions.
– Amessihel
Nov 16 '18 at 10:45