2013-02-14 3 views
6

Вот как strtol должно быть объявлено в соответствии с § 7.22.1.4 из С11 (n1570):псевдонимы аргументов в strtol

#include <stdlib.h> 

long int strtol (const char *restrict nptr, 
       char **restrict endptr, 
       int base); 

Насколько я знаю, restrict ключевого слова означает, что объект, на который ссылается Lvalue *nptr будет доступ к ним только с ним или непосредственно полученное от него значение.

Однако, много программистов, и даже опытные из них, использовать strtol следующим образом:

#include <stdlib.h> 

strtol (p, &p, 10); 

В этом случае, **endptr == **&p == *p == *nptr и поведение не определено. Это правильно?

+1

Некоторое время назад я написал сообщение в блоге на тему, что 'ограничивать 'является разочарованием как элементом спецификации, потому что он неявно ссылается на реализацию. Если реализация 'strtol()' реализует как '** endptr', так и' * nptr', то не определено передать 'p' и' & p'. Если это не так, то это не является неопределенным для передачи этих аргументов. Спецификация, подразумеваемая 'ограничивать', имеет смысл только в отношении самой реализации, которая должна быть скрыта спецификацией. http://blog.frama-c.com/index.php?post/2012/08/02/restrict-not-modular –

ответ

8

№ Ничего не доступно через **endptr в strtol. Доступен только *endptr, полностью отдельный объект.