语句原型:void smc_timing_init(int cs) __attribute__((weak, alias("_smc_timing_init")));
总结:_smc_timing_init是smc_timing_init的别名,具有弱属性。当smc_timing_init未定义,调用smc_timing_init时执行_smc_timing_init。当smc_timing_init已定义,调用smc_timing_init时执行smc_timing_init,屏蔽_smc_timing_init。
注意:smc_timing_init和_smc_timing_init不能放在同一个文件中。
weak.c
#include <stdio.h>
void smc_timing_init(int cs) __attribute__((weak, alias("_smc_timing_init")));
void _smc_timing_init(int cs)
{
int i = 1;
i = i+cs;
printf("_smc_timing_init:%d\n", i);
}
strong.c
#include <stdio.h>
void smc_timing_init(int cs)
{
int i = 0;
i = i+cs;
printf("smc_timing_init:%d\n", i);
}
main.c
#include <stdio.h>
int main()
{
smc_timing_init(1);
_smc_timing_init(1);
return 0;
}
makefile
objects = main.o weak.o
main : $(objects)
cc -o main $(objects)
.PHONY : clean
clean :
-rm main $(objects)
执行结果:
_smc_timing_init:2
_smc_timing_init:2
makefile
objects = main.o weak.o strong.o
main : $(objects)
cc -o main $(objects)
.PHONY : clean
clean :
-rm main $(objects)
执行结果:
smc_timing_init:1
_smc_timing_init:2
最新的makefile
VPATH = ../weak\
../strong
OBJ_DIR = ../bin
RELEASE_DIR = ../release
objects = main.o weak.o strong.o
main : $(objects)
cc -o main $(objects)
mv main.o strong.o weak.o $(OBJ_DIR)
mv main $(RELEASE_DIR)
.PHONY : clean
clean :
-rm $(RELEASE_DIR)/main $(foreach VAR,$(objects),$(OBJ_DIR)/$(VAR))
字节对齐:
#pragma pack(1) /* 将地址对齐界线改为1的整数倍 */
struct my_struct {
char ch1;
char ch2;
int n;
char ch3;
}; /* 整个结构体占据7个字节 */
#pragma pack()
GNU C支持结构体的扩展属性。
struct my_struct {
char ch1;
char ch2;
int n;
char ch3;
} __attribute__ ((packed)); /* 指明此结构是“紧凑”的,占据7个字节 */
总结:_smc_timing_init是smc_timing_init的别名,具有弱属性。当smc_timing_init未定义,调用smc_timing_init时执行_smc_timing_init。当smc_timing_init已定义,调用smc_timing_init时执行smc_timing_init,屏蔽_smc_timing_init。
注意:smc_timing_init和_smc_timing_init不能放在同一个文件中。
weak.c
#include <stdio.h>
void smc_timing_init(int cs) __attribute__((weak, alias("_smc_timing_init")));
void _smc_timing_init(int cs)
{
int i = 1;
i = i+cs;
printf("_smc_timing_init:%d\n", i);
}
strong.c
#include <stdio.h>
void smc_timing_init(int cs)
{
int i = 0;
i = i+cs;
printf("smc_timing_init:%d\n", i);
}
main.c
#include <stdio.h>
int main()
{
smc_timing_init(1);
_smc_timing_init(1);
return 0;
}
makefile
objects = main.o weak.o
main : $(objects)
cc -o main $(objects)
.PHONY : clean
clean :
-rm main $(objects)
执行结果:
_smc_timing_init:2
_smc_timing_init:2
makefile
objects = main.o weak.o strong.o
main : $(objects)
cc -o main $(objects)
.PHONY : clean
clean :
-rm main $(objects)
执行结果:
smc_timing_init:1
_smc_timing_init:2
最新的makefile
VPATH = ../weak\
../strong
OBJ_DIR = ../bin
RELEASE_DIR = ../release
objects = main.o weak.o strong.o
main : $(objects)
cc -o main $(objects)
mv main.o strong.o weak.o $(OBJ_DIR)
mv main $(RELEASE_DIR)
.PHONY : clean
clean :
-rm $(RELEASE_DIR)/main $(foreach VAR,$(objects),$(OBJ_DIR)/$(VAR))
字节对齐:
#pragma pack(1) /* 将地址对齐界线改为1的整数倍 */
struct my_struct {
char ch1;
char ch2;
int n;
char ch3;
}; /* 整个结构体占据7个字节 */
#pragma pack()
GNU C支持结构体的扩展属性。
struct my_struct {
char ch1;
char ch2;
int n;
char ch3;
} __attribute__ ((packed)); /* 指明此结构是“紧凑”的,占据7个字节 */