【问题标题】:C++ automatic pre-processor code generationC++ 自动预处理器代码生成
【发布时间】:2014-11-18 07:25:07
【问题描述】:

我有一个看起来像

的 sn-p
std::string z_A_file("z_A.txt");
z_A_file = inputs_folder + z_A_file.c_str();
Eigen::Matrix<PRECISION, Eigen::Dynamic, Eigen::Dynamic> z_A_ = readArbitraryMatrix<PRECISION>(z_A_file.c_str());
Eigen::VectorXf z_A = z_A_;
//
std::string z_B_file("z_B.txt");
z_B_file = inputs_folder + z_B_file.c_str();
Eigen::Matrix<PRECISION, Eigen::Dynamic, Eigen::Dynamic> z_B_ = readArbitraryMatrix<PRECISION>(z_B_file.c_str());
Eigen::VectorXf z_B = z_B_;

我可以有一个 PRE-PROCESSOR 函数,这样我就可以写了

read_vector(A);
read_vector(B);

而不是重复相同的代码?

【问题讨论】:

  • 不知何故 Inception 浮现在脑海中。你可以,但那有什么用呢?创建向量集合,创建适合文件的命名方案,映射它。 lambda 的奖励积分。
  • 如果你有五个或更多这样的sn-ps,那可能是值得的。就两个而言,使用预处理器不值得失去代码的可见性。
  • 我有大约 100 个这样的 sn-ps :-) 所以重写它们可能会引入错误。
  • 它们并不像 A、B 那样简单,但文件名相当临时且复杂。

标签: c++ gcc g++ c-preprocessor preprocessor-directive


【解决方案1】:

我可以有一个 PRE-PROCESSOR 函数,这样我就可以写了

这个文件:

#define read_vector(x) \
std::string z_##x##_file("z_"#x".txt");\
z_##x##_file = input_folder + z_##x##_file.cstr();\
Eigen::Matrix<PRECISION, Eigen::Dynamic, Eigen::Dynamic> z_##x##_ = readArbitraryMatrix<PRECISION>(z_##x##_file.cstr());\
Eigen::VectorXf z_##x = z_##x##_;

read_vector(A);
read_vector(B);

预处理后: g++ -E main.cpp -o main.pp

出生于:

# 1 "main.cpp"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "main.cpp"

std::string z_A_file("z_""A"".txt");z_A_file = input_folder + z_A_file.cstr();Eigen::Matrix<PRECISION, Eigen::Dynamic, Eigen::Dynamic> z_A_ = readArbitraryMatrix<PRECISION>(z_A_file.cstr());Eigen::VectorXf z_A = z_A_;;
std::string z_B_file("z_""B"".txt");z_B_file = input_folder + z_B_file.cstr();Eigen::Matrix<PRECISION, Eigen::Dynamic, Eigen::Dynamic> z_B_ = readArbitraryMatrix<PRECISION>(z_B_file.cstr());Eigen::VectorXf z_B = z_B_;;

这是你所期望的吗?

【讨论】:

  • 最好有一个丑陋的宏,而不是把相同的代码段重复100次;当人们更新代码时,后者很容易出现不一致(因为他们有时会忘记更新所有 100 个实例,或者在每次公式更改时都需要进行 100 次繁琐的编辑中的一个或多个)
  • 虽然我认为@JeremyFriesner 是完全正确的,但这个宏的风格真的 很糟糕:它插入了变量声明,以下对这些变量的使用将显得非常神奇。当然,如果它提供足够的好处,这并不是不使用它的论据,但这些好处必须非常大,才能保证这样一个违反直觉的宏观。而且它几乎强制宏仅在其定义的 50 行内使用。最好尝试重新定义宏,使其表现得像一个函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-03
  • 1970-01-01
  • 2016-09-10
  • 1970-01-01
  • 2012-12-11
  • 1970-01-01
相关资源
最近更新 更多