宏定义中的"#"、"##"、"..."、"__VA_AGRS__"

本文详细介绍了C语言宏定义中的特殊字符用法,包括'#'用于将参数转为字符串,'##'用于拼接符号,'...'和__VA_ARGS__用于可变参数宏,提供了示例代码解释其工作原理,并提及了ANSI C中的预定义宏__LINE__、__FILE__、__DATE__和__TIME__。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、"#"

在宏定义中,"#"的作用是将标记转换为字符串

eg: #define func(x)printf("the func() of #x is %d \n",x*x)

int main(void)

{

int a = 4;

func(a);

func(4+4);

retturn 0;

}

输出的结果是:

the func() of y is 16将x替换成y

the func() of 4+4 is 256将x换成 4+4


二、"##"

在宏定义中,"##"运算符是把两个语言符号组合成一个语言符号

eg: define a(x) a##_x

a(5)的宏定义展开为a_5

define a(x)a##x

a(5)的宏定义展开为a5


另外在define func(fmt, args...)printf(fmt, ##args)

宏定义中,##的作用是当func()传递的只有一个参数时,这时宏定义展开多出来一个","  ,##的作用就是消除这个多余的逗号,当传递的参数多余两个时,##不起作用。

eg: define func(fmt ,argx...) printf(fmt,args)

当宏定义是这样时,func("%s\n")展开之后是printf("%s\n" ,);这样就多出一个","  ,这时可以用##来消除这个多出来的逗号。


三、"..."

宏定义

define func(fmt, args...)printf(fmt, ##args)

define func(fmt, ...)printf(fmt, ##__VA_AGRS__)

二者是等效的,其中"..."表示可变参数的含义,而__VA_ARGS__ 是一个可变参数的宏,很少人知道这个宏,这个可变参数的宏是新的C99规范中新增的,目前似乎只有gcc支持(VC6.0的编译器不支持)。

实现的方法是,当"..."的位置在可变参数的最后时,这时就可以使用__VA_ARGS__来替代"..."的代表的内容



ANSI C标准中有几个标准预定义宏(也是常用的):

__LINE__:在源代码中插入当前源代码行号;

__FILE__:在源文件中插入当前源文件名;

__DATE__:在源文件中插入当前的编译日期

__TIME__:在源文件中插入当前编译时间;


#include <stdio.h>


#define __DEBUG__


#ifdef __DEBUG__
#define DEBUG(format,...) printf("File: "__FILE__", Line: %05d: "format"\n", __LINE__, ##__VA_ARGS__)
#else
#define DEBUG(format,...)
#endif


int main(int argc, char **argv) {
    char str[]="Hello World";
    DEBUG("check me: %s",str);
    return 0;
}

输出:

FILE:  /home/hxl_project/test.c , Line:  00021, check me, Hello Word










下面的代码是干什么用的,请生成说明注释,同时还有什么改进: 【import lightgbm as lgb import pandas as pd import numpy as np import datetime from utils import * import itertools import utils.new_oputils as oputils import utils.globalvar as gl from copy import deepcopy from constant.constant import ( COM_DATE, COM_SEC, TRADE_NUM, STOCK_NUM, ) from ini.ini import * from constant.constant import * gl._init() from factors_build.constant import * class Factors_Build(): def __init__(self,factor_builds,env): self.factor_builds =factor_builds self.__env = env def get_env(self): return self.__env def set_env(self,env): self.__env = env def __factor_builds(self): def _fun_cal(X, _program, mode=&#39;run&#39;,feature_name = None): if (isinstance(_program[0], int)): return X[:, _program[0]], _program[1:] else: arg = [] _program2 = None for i in range(_program[0].arity): if (i == 0): Y, _program2 = _fun_cal(X, _program[1:], mode) else: Y, _program2 = _fun_cal(X, _program2, mode) arg.append(Y) if (_program[0].name not in Oputis): if (mode == &#39;run&#39;): return _program[0](*arg), _program2 else: return _program[0](*arg), _program2 else: return _program[0].function(*arg), _program2 data = self.get_env().query_data(Factors_Data) res = self.get_env().query_data(Index_Data) for i in range(len(self.factor_builds._best_programs)): _program_ = self.factor_builds._best_programs[i] _program = _program_.program X = data.astype(float) Y, pro = _fun_cal(X.values, _program) if(i<50): res[&#39;factor_&#39;+str(i)] = Y else: break return res def run(self,is_local = False): if is_local == False: market = self.get_env().query_data(Market_Data).get_data_serise() code = list(set(market[COM_SEC])) trade_date = list(set(market[COM_DATE])) trade_date.sort() gl.set_value(STOCK_NUM, len(code)) gl.set_value(TRADE_NUM, len(trade_date)) chg1 = conv(market[[COM_SEC, COM_DATE, Close]], trade_date=COM_DATE, sec_code=COM_SEC, method=1).fillna(method=&#39;ffill&#39;) chg = unconv(chg1.shift(-1)/chg1.shift(0)-1,name = &#39;ret&#39;).reset_index() param_combinations = list(itertools.product(*[code, trade_date])) data_index = pd.DataFrame( param_combinations, columns=[COM_SEC, COM_DATE] ).sort_values( [COM_DATE, COM_SEC] ) data = pd.merge( data_index, market, on = [COM_DATE, COM_SEC], how = &#39;left&#39; ).sort_values(by = [COM_SEC,COM_DATE],ascending=[True,False]) data = pd.merge( data, chg, on = [COM_DATE, COM_SEC], how = &#39;left&#39; ).sort_values(by = [COM_SEC,COM_DATE],ascending=[True,False]) self.get_env().add_data(data[[COM_SEC,COM_DATE,Ret]],Index_Data) del data[COM_DATE] del data[COM_SEC] del data[&#39;ret&#39;] self.get_env().add_data(data, Factors_Data) res = self.__factor_builds() data = pd.merge( market[[COM_DATE, COM_SEC]], res, on = [COM_DATE, COM_SEC], how = &#39;left&#39; ) h = pd.HDFStore(os.path.join(RESULTS,Factors_Data+&#39;.h5&#39;),&#39;w&#39;) h[&#39;data&#39;] = data h.close() h = pd.HDFStore(os.path.join(RESULTS,Index_Data+&#39;.h5&#39;),&#39;w&#39;) h[&#39;data&#39;] = data_index h.close() else: data = pd.read_hdf(os.path.join(RESULTS,Factors_Data+&#39;.h5&#39;)) data_index = pd.read_hdf(os.path.join(RESULTS,Index_Data+&#39;.h5&#39;)) self.get_env().add_data(data,Factors_Data) self.get_env().add_data(data_index,Index_Data) pass def feature_choice( self, days=21, is_local = False ): if(is_local): feature_info = pd.read_hdf(os.path.join(RESULTS,Feature_Info+&#39;.h5&#39;)) else: factors = self.get_env().query_data(Factors_Data) factors = factors[ factors[COM_DATE]>=&#39;2010-01-01&#39; ] trade_list = list(set(factors[COM_DATE])) trade_list.sort() if len(trade_list)%days==0: n = int(len(trade_list)/days)-7 else: n = int(len(trade_list)/days)-6 feature_info = pd.DataFrame() begin_index = 147 feature = list(factors.columns) feature.remove(COM_SEC) feature.remove(COM_DATE) feature.remove(Ret) for i in range(n): end_date = days*i+begin_index-21 begin_date = days * i trade_date = days*i+begin_index print(trade_list[trade_date]) train_data = factors[ (factors[COM_DATE]<=trade_list[end_date]) & (factors[COM_DATE]>=trade_list[begin_date]) ] model = lgb.LGBMRegressor() model.fit(train_data[feature],train_data[Ret]) feature_info_cell = pd.DataFrame(columns=Info_Fields) feature_info_cell[Importance] = model.feature_importances_ feature_info_cell[Feature_Name] = model.feature_name_ feature_info_cell = feature_info_cell.sort_values(by=Importance).tail(10) feature_info_cell[COM_DATE] = trade_list[trade_date] feature_info = pd.concat( [feature_info,feature_info_cell], axis = 0 ) h = pd.HDFStore(os.path.join(RESULTS,Feature_Info+&#39;.h5&#39;),&#39;w&#39;) h[&#39;data&#39;] = feature_info h.close() self.get_env().add_data(feature_info,Feature_Info) pass def clean(self,is_local = False): def __clean(df,feature): for col in feature: df[col] = df[col].fillna(np.nanmedian(df[col])) df[col] = np.argsort(np.argsort(df[col])) df[col] = (df[col]-np.nanmean( df[col]))/( np.nanstd(df[col])+0.0000001) return df if is_local: factors = pd.read_hdf(os.path.join(RESULTS,Factors_Clean_Data+&#39;.h5&#39;)) else: factors = self.get_env().query_data(Factors_Data) data_index = self.get_env().query_data(Index_Data) feature = list(factors.columns) feature.remove(COM_SEC) feature.remove(COM_DATE) factors = factors.groupby(COM_DATE).apply(lambda df:__clean(df,feature)) factors = pd.merge( data_index, factors, on=[COM_DATE,COM_SEC], how = &#39;left&#39; ) h = pd.HDFStore(os.path.join(RESULTS,Factors_Clean_Data+&#39;.h5&#39;),&#39;w&#39;) h[&#39;data&#39;] = factors h.close() self.get_env().add_data(factors,Factors_Clean_Data)
06-04
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值