在C中使用'const',可能会导致什么样的移植问题?

时间:2011-06-17 16:41:28

标签: c const portability

我想在C接口函数中使用'const'来注意某些char *参数不会被函数修改。

将此代码移植到各种平台会导致什么问题?在C代码中支持'const'是否相当标准?这什么时候正式成为C标准?

6 个答案:

答案 0 :(得分:6)

我无法想象const没有得到任何编译器的支持,因此移植应该不是问题。如果你 找到这样的野兽,你可以放

#define const

在公共头文件中的某个位置,可以使所有const个关键字消失。程序的运行时语义根本不会改变(因为你的编译器不支持关键字)。

答案 1 :(得分:3)

这是非常标准的。我认为它来自C89。

答案 2 :(得分:3)

它适用于MSVC,这是克服C便携性的最大障碍。

答案 3 :(得分:1)

几乎所有现代编译器都应正确处理const。流行的选择肯定会支持它。自C89,IIRC以来,它一直是标准。

答案 4 :(得分:1)

正如其他答案所说,const是标准的。您将遇到的唯一问题是错误地使用它。指针const可能很棘手。确保你正在构建正确的东西:

See the wikipedia article on const-correctness:

对于指针和引用类型,语法稍微有点微妙。指针对象可以声明为const指针或指向const对象(或两者)的指针。 const指针不能重新分配以指向与最初分配的对象不同的对象,但它可用于修改它指向的对象(称为“指针对象”)。因此,引用变量是const指针的替代语法。另一方面,指向const对象的指针可以重新分配以指向相同类型或可转换类型的另一个对象,但它不能用于修改任何对象。还可以声明指向const对象的const指针,既不能用于修改指针,也不能重新指定指向另一个对象。以下代码说明了这些细微之处:

void Foo( int       *       ptr,
      int const *       ptrToConst,
      int       * const constPtr,
      int const * const constPtrToConst )
{
*ptr = 0; // OK: modifies the pointee
ptr  = 0; // OK: modifies the pointer

*ptrToConst = 0; // Error! Cannot modify the pointee
ptrToConst  = 0; // OK: modifies the pointer

*constPtr = 0; // OK: modifies the pointee
constPtr  = 0; // Error! Cannot modify the pointer

*constPtrToConst = 0; // Error! Cannot modify the pointee
constPtrToConst  = 0; // Error! Cannot modify the pointer
}

答案 5 :(得分:1)

  

实现可能会在只读区域中放置一个非易失性的const对象   存储

     

(WG14 / N1336 sec 6.7.3,脚注117)

有些(交叉)编译器对此很古怪;它们将非常量变量视为放置在RAM中的变量,将常量变量视为放置在真实只读存储器设备(EEPROM或闪存)中的常量变量

在这种情况下你会遇到麻烦,因为类型*和const类型*将引用不同的内存区域。

考虑:

void foo(const char* arg); /* intent is not to modify anything through arg, but arg refers to a memory location in ROM */
/* ... */
char bar[] = "abc";
const char baz[] = "def";
foo(bar);  /* behavior is undefined! */
foo(baz);  /* should be ok */

我不知道基于PC的编译器会这样做,但这在微控制器交叉编译器中似乎很常见。我最近在ImageCraft的PSoC1编译器上移植FatFs时遇到了这个问题,并且不得不像Carl建议的那样#define away consts。