Deutsch English Français Italiano |
<8734j9sj0f.fsf@nosuchdomain.example.com> View for Bookmarking (what is this?) Look up another Usenet article |
Path: ...!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: Keith Thompson <Keith.S.Thompson+u@gmail.com> Newsgroups: comp.lang.c Subject: Re: question about linker Date: Fri, 29 Nov 2024 15:44:00 -0800 Organization: None to speak of Lines: 144 Message-ID: <8734j9sj0f.fsf@nosuchdomain.example.com> References: <vi54e9$3ie0o$1@dont-email.me> <vi6sb1$148h7$1@paganini.bofh.team> <vi6uaj$3ve13$2@dont-email.me> <87plmfu2ub.fsf@nosuchdomain.example.com> <vi9jk4$gse4$1@dont-email.me> <vi9kng$gn4c$1@dont-email.me> <87frnbt9jn.fsf@nosuchdomain.example.com> <viaqh0$nm7q$1@dont-email.me> <877c8nt255.fsf@nosuchdomain.example.com> <viasv4$nm7q$2@dont-email.me> <vibr1l$vvjf$1@dont-email.me> <vic73f$1205f$1@dont-email.me> <20241129142810.00007920@yahoo.com> <vicfra$13nl4$1@dont-email.me> <20241129161517.000010b8@yahoo.com> <vicque$15ium$2@dont-email.me> <vid110$16hte$1@dont-email.me> <87mshhsrr0.fsf@nosuchdomain.example.com> <vidd2a$18k9j$1@dont-email.me> MIME-Version: 1.0 Content-Type: text/plain Injection-Date: Sat, 30 Nov 2024 00:44:01 +0100 (CET) Injection-Info: dont-email.me; posting-host="d28f02e76a6c2d00a69abdf93e7df1d2"; logging-data="1354134"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX19lsGOMzHWvdeDsrUqkOCsf" User-Agent: Gnus/5.13 (Gnus v5.13) Cancel-Lock: sha1:OpdW/2HKjjhH/F0ztz8PASskkBU= sha1:2FoCHI3pVsOBPm9dzqSmsfYuXIM= Bytes: 7731 Bart <bc@freeuk.com> writes: > On 29/11/2024 20:35, Keith Thompson wrote: >> Bart <bc@freeuk.com> writes: >> [...] >>> C's syntax allows a 14-parameter function F to be declared in the same >>> statement as a simple int 'i'. >> Yes (except that it's a declaration, not a statement) : >> int i = 42, F(int, int, int, int, int, int, int, >> int, int, int, int, int, int, int); >> Are you under the impression that anyone here was not already aware >> of >> that? Would you prefer it if the number of parameters were arbitrarily >> restricted to 13? >> Do you think that anyone would actually write code like the above? >> C generally doesn't impose arbitrary restrictions. Because of that, >> it's possible to write absurd code like the declaration above. 99% of >> programmers simply don't do that, so it's not a problem in practice. >> >>> I'd say that F and i are different types! (Actually I wouldn't even >>> consider F to be type, but a function.) >> Neither F nor i is a type. i is an object (of type int), and F is a >> function (of type int(int, int, int, int, int, int, int, int, int, int, >> int, int, int, int)). >> >>> That F(1, 2, 3.0, "5", "six", seven, ...) might yield the same type as >>> 'i' is irrelevant here. >> It's relevant to the syntax. i and F can be declared in the same >> declaration only because the type of i and the return type of F happen >> to be the same. If F returned void, i and F would have to be declared >> separately. >> Which, of course, is a good idea anyway. >> You're posting repeatedly trying to convince everyone that C allows >> ridiculous code. We already know that. You are wasting everyone's time >> telling us something that we already know. Most of us just don't obsess >> about it as much as you do. Most of us recognize that, however >> convoluted C's declaration syntax might be, it cannot be fixed in a >> language calling itself "C". >> Most of us here are more interested in talking about C as it's >> specified, and actually trying to understand it, than in complaining >> about it. >> >>> Usually, given these declarations: >>> >>> int A[100] >>> int *B; >>> int (*C)(); >>> >>> people would consider the types of A, B and C to be array, pointer and >>> function pointer respectively. Otherwise, which of the 4 or 5 possible >>> types would you say that D has here: >>> >>> int D[3][4][5]; >>> >>> It depends on how it is used in an expression, which can be any of &D, >>> D, D[i], D[i][j], D[i][j][k], none of which include 'Array' type! >> No, the object D unambiguously has type int[3][4][5] > > (So it would have a different type from E declared on in the same > declaration: > > int D[3][4][5], E; > > ? In that case tell that to David Brown!) Yes, of course D and E have different types. I'm certain he's aware of that. I wrote that the object D is unambiguously of type int[3][4][5], and the expression D can be of the array type int[3][4][5] or of the pointer type int(*)[3][4], depending on the context. Do you agree? Or do you still claim that D can have any of "4 or 5 possible types"? (Note that I'm not talking about the type of the expression D[i] or of any other expression that includes D as a subexpression.) > You seem have missed the point of my post, which was a reply to > David's remark that 'they can't have totally different types' which > was in response to my saying that each variable in the same > declaration can 'be [of] a totally different type'. David apparently has a different definition of "totally different types" than you do. Since the standard doesn't define that phrase, I suggest not wasting time arguing about it. Given: int D[3][4][5], E; the object D is of type int[3][4][5], and E is of type int. Do you understand that? If you wanted to change the type of D from int[3][4][5] to double[3][4][5], you'd have to use two separate declarations. Do you understand that? (Of course you do, but will you admit that you understand it?) I think that distinction is what David had in mind. double[3][4][5] and int are "totally different types", but int[3][4][5] and int are not. Entities of "totally different types" cannot be declared in a single declaration. You don't have to accept that meaning of the phrase (which I find a bit vague), but it's clearly what David meant. The point is that there are restrictions on what can be combined into a single declaration. But these days it's usually considered good style to declare only one identifier in each declaration, so while this : int i, *p; is perfectly valid, and every C compiler must accept it, this : int i; int *p; is preferred by most C programmers. Do you understand that? > DB is assuming the type of the variable after it's been used in an > expression that is fully evaluated to yield its base type. So my > A[100] is used as A[i], and D[3][4][5] is used as D[i][j][k]. > > But of course they may be evaluated only partially, yielding a range > of types. What "range of types" do you think D can have? >> Would you write "const int F();"? Or would you omit the "const"? How >> does the fact that "const" is allowed inconvenience you? > > It's another point of confusion. In my language I don't treat function > declarations like variable declarations. A function is not a > variable. There is no data storage associated with it. In C, declarations can declare objects, functions, types, etc. I fail to see how your language is relevant. > In C it is unfortunate, as it makes it hard to trivially distinguish a > function declaration (or the start of a function definition) from a > variable declaration. It's not as hard as you insist on pretending it is. A function declaration includes a pair of parentheses, either empty or containing a list of parameters or parameter types. Function declarations outside header files are valid, but tend to be rare in well-written C code. -- Keith Thompson (The_Other_Keith) Keith.S.Thompson+u@gmail.com void Void(void) { Void(); } /* The recursive call of the void */