【问题标题】:Fooling a c++ compiler. Passing int instead of a cont int into function愚弄 C++ 编译器。将 int 而不是 cont int 传递给函数
【发布时间】:2013-08-18 09:42:56
【问题描述】:

如何将 int 传递给期望 const int 的函数。

或者有没有办法修改 cont int 值?

编辑:我应该在前面提到这一点,我正在使用用于编程 pic 微控制器的 ccs c 编译器。 fprintf 函数将 constant 流作为其第一个参数。它只会接受一个常量 int 并抛出编译错误,否则“Stream must be a constant in the valid range.”。

编辑 2:流是一个常量字节。

【问题讨论】:

  • 不确定您所说的“愚弄”是什么意思...它开箱即用...
  • 即使不是因为拷贝 (like this),不修改非常量数据变量也是可以的,所以没有理由不接受。另一方面,修改 const 变量是,如果在链接中将 const 切换为r,编译器会报错。
  • 这不是在抱怨const。当它期望FILE* 时,它抱怨被交给int。再想一想,由于此编译器会进行范围检查,您可能确实需要提供一个编译时间常数。但是,这与 const 修饰符无关。
  • @IInspectable 在这种情况下,流是常量字节。如果我通过 const uint_8,编译器会很高兴

标签: c++ compiler-construction int


【解决方案1】:

函数参数列表中的顶级const被完全忽略,所以

void foo(const int n);

完全一样

void foo(int n);

所以,您只需传递一个int

唯一的区别在于函数定义,其中n在第一个例子中是const,而在第二个例子中是可变的。所以这个特殊的const 可以看作是一个实现细节,应该在函数声明中避免。比如这里我们不想修改函数内部的n

void foo(int n); // function declaration. No const, it wouldn't matter and might give the wrong impression

void foo(const int n) 
{
  // implementation chooses not to modify n, the caller shouldn't care.
}

【讨论】:

  • 我猜 ccs c 编译器不像我想的那样类似于原生 c。
【解决方案2】:

这不需要欺骗。需要 const int 类型参数的函数将很乐意接受 int 类型的参数。

以下代码可以正常工作:

void MyFunction(const int value);

int foo = 5;
MyFunction(foo);

因为参数是按值传递的,所以const 实在是毫无意义。唯一的作用是确保函数的变量的本地副本不被修改。您传递给函数的变量将永远被修改,无论参数是否被视为const

【讨论】:

    猜你喜欢
    • 2020-11-19
    • 1970-01-01
    • 2021-04-13
    • 1970-01-01
    • 2012-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多