【发布时间】:2017-11-13 17:14:33
【问题描述】:
为什么使用 double 时以下不起作用(它使用 int 起作用)
test.c
#include "myFcn.h"
#include <stdio.h>
int main () {
printf("L1: %f \n", myGet_L1());
mySet_L1(10.0);
printf("L1: %f \n", myGet_L1());
return 0;
}
myFcn.c
#include "myFcn.h"
double L1 = 0.0;
double get(double *v) {
return *v;
}
void set(double *variable, double value) {
*variable = value;
}
myFcn.h
#ifndef __MYFCN_H__
#define __MYFCN_H__
extern double L1;
#define myGet_L1() get(&L1)
#define mySet_L1(value) set(&L1, (value))
#endif
我不明白为什么这在使用 int 而不是 doubles 时有效?
【问题讨论】:
-
你需要test.c中
get和set的函数原型。 -
为什么将 L1 声明为全局意大利面条变量?有什么特殊原因不能对 myFcn.c 私有?
-
获取新的编译器!隐式 int 函数声明在 18 年前被禁止。为什么有人会使用一个在过去 18 年里没有更新过的编译器? (如果 gcc 版本低于 5.0,问题通常是配置错误。使用
-std=c11 -pedantic-errors。) -
@Lundin,它不能是私有的,因为它用于宏扩展。即,test.c:11:25:错误:使用未声明的标识符“L1”,./myFcn.h:7:42:注意:从宏“myGet_L1”扩展
-
@user3502042 是啊,你为什么在宏扩展中使用它?这完全是多余的,并且与私有封装相矛盾。
static double L1 = 0.0; ... double get(void) { return L1; }; ... void set (double value) { L1 = value; }